如何修改ASP.NET Core EF脚手架的导航列绑定字段
如何让ASP.NET Core EF6脚手架自动绑定非主键显示字段?
场景与问题
我用EF6搭配ASP.NET Core的代码优先模式,通过脚手架模板生成了数百张表和视图。现有导航模型如下:
public class BaseModel { public int Id { get; set; } [MaxLength(100)] [Column(TypeName = "varchar(100)")] public string? BaseModelNo { get; set; } public virtual ICollection<SubModel>? SubModels { get; set; } } public class SubModel { public int Id { get; set; } [MaxLength(100)] [Column(TypeName = "varchar(100)")] public string? SubModelNo { get; set; } public int BaseModelId { get; set; } // 注:原代码此处命名有误,修正为正确的导航属性名称 public virtual BaseModel? BaseModel { get; set; } }
当前脚手架生成的控制器代码片段:
// ... ViewData["BaseModelId"] = new SelectList(_context.BaseModels, "Id", "Id", model.BaseModelId); return View(); // ...
详情视图代码片段:
<!-- ... --> <dd class="col-sm-10"> @Html.DisplayFor(model => model.BaseModel.Id) </dd> <!-- ... -->
我需要让脚手架自动绑定到非主键Id的第一个字段(示例里是BaseModelNo),让控制器生成这样的代码:
// ... ViewData["BaseModelId"] = new SelectList(_context.BaseModels, "Id", "BaseModelNo", model.BaseModelId); return View(); // ...
详情视图生成这样的代码:
<!-- ... --> <dd class="col-sm-10"> @Html.DisplayFor(model => model.BaseModel.BaseModelNo) </dd> <!-- ... -->
试过调整模型属性顺序,没用。
解决方案
1. 用[DisplayColumn]特性(最简单有效)
在被引用的实体类上添加[DisplayColumn]特性,指定默认显示字段:
[DisplayColumn("BaseModelNo")] // 告诉脚手架用这个字段作为默认显示值 public class BaseModel { public int Id { get; set; } [MaxLength(100)] [Column(TypeName = "varchar(100)")] public string? BaseModelNo { get; set; } public virtual ICollection<SubModel>? SubModels { get; set; } }
这个特性是EF6原生支持的,添加后脚手架生成下拉列表和详情视图时,会自动用指定字段替代主键Id作为显示内容。
2. 自定义脚手架模板(适合批量统一修改)
如果需要对所有模型统一设置规则(比如自动选第一个非主键字符串字段),可以修改脚手架模板:
- 找到项目中的脚手架模板目录(没有的话可以从NuGet包
Microsoft.VisualStudio.Web.CodeGeneration.Design里提取模板文件) - 编辑控制器模板(如
ControllerGenerator.cshtml),修改生成SelectList的逻辑,把第三个参数从"Id"改成目标字段 - 编辑详情视图模板(如
Details.cshtml),修改导航属性的显示逻辑,替换Id为目标字段
这种方式需要维护自定义模板,但能一次性解决大量模型的需求。
注意点
- 原
SubModel里的导航属性命名错误,必须改成BaseModel而不是BaseModelNo,否则导航关系会失效 [DisplayColumn]特性只需要加在被引用的实体类上(比如BaseModel),不需要在引用方(SubModel)添加
内容的提问来源于stack exchange,提问作者Pierre
相关产品推荐
相关产品推荐

