MVC逻辑疑问:如何将Persons实体映射到OnlyPrivateProp模型并传至视图
解决方法
1. 修正控制器并实现数据映射与传递
首先给控制器的上下文字段加上正确的访问修饰符(通常用private readonly保证不可修改),然后通过LINQ投影直接从Persons实体筛选所需属性并映射到OnlyPrivateProp模型,最后把数据传递给视图:
public class DemoController : Controller { private readonly _context _c; public DemoController(_context c) { _c = c; } public IActionResult Index() { // 通过LINQ投影,仅提取需要的字段并映射到目标模型 var personList = _c.Persons .Select(p => new OnlyPrivateProp { Id = p.Id, Name = p.Name, Surname = p.Surname }) .ToList(); // 将整理好的模型传递给视图 return View(personList); } }
2. 创建强类型视图
在Views/Demo/Index.cshtml中创建强类型视图,用来接收并展示数据:
@model IEnumerable<OnlyPrivateProp> <h1>人员列表</h1> <table border="1"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>姓氏</th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr> <td>@item.Id</td> <td>@item.Name</td> <td>@item.Surname</td> </tr> } </tbody> </table>
额外优化:用AutoMapper简化映射(可选)
如果项目里需要频繁做实体和模型的映射,可借助AutoMapper减少手动赋值代码:
- 安装
AutoMapper和AutoMapper.Extensions.Microsoft.DependencyInjectionNuGet包 - 配置映射关系:
// 在Program.cs中注册AutoMapper builder.Services.AddAutoMapper(typeof(Program)); // 创建映射配置文件 public class MappingProfile : Profile { public MappingProfile() { // 自动匹配同名属性,无需手动赋值 CreateMap<Persons, OnlyPrivateProp>(); } }
- 在控制器中注入并使用:
private readonly _context _c; private readonly IMapper _mapper; public DemoController(_context c, IMapper mapper) { _c = c; _mapper = mapper; } public IActionResult Index() { var persons = _c.Persons.ToList(); var personList = _mapper.Map<List<OnlyPrivateProp>>(persons); return View(personList); }
核心逻辑说明
- LINQ投影查询会让EF Core只从数据库拉取
Id、Name、Surname三个字段,避免冗余数据传输,提升性能。 OnlyPrivateProp在这里是DTO(数据传输对象),专门用来在控制器和视图之间传递精简数据,避免暴露实体的全部属性。
内容的提问来源于stack exchange,提问作者Ahmet Demir
相关产品推荐
相关产品推荐

