ASP.NET MVC如何在下拉列表显示关联表名称而非ID供用户选择
错误根源
你的运行时报错由两个基础属性匹配问题导致:
- C#大小写敏感,User模型中定义的职位导航属性为小写开头的
designation,视图中调用时写为大写开头的Designation,框架找不到对应属性触发异常 - Designation模型中存储职位名称的属性为
DesignationName,你视图中调用的Name属性不存在 - 额外的无效代码:User模型中自引用的
public User user { get; set; }无业务意义,控制器中Include(us => us.user)属于无效关联加载,可能引发额外的查询异常
修复方案
1. 调整控制器代码
如果你需要实现注册页职位下拉选择,需要提前将所有职位数据加载后传递到视图:
public class HomeController : Controller { private CompanyPrintersEntities db = new CompanyPrintersEntities(); // 注册页Action public ActionResult Register() { // 构造下拉选项:值存职位ID,文本存职位名称 ViewBag.DesignationOptions = new SelectList(db.Designations.ToList(), "DesignationID", "DesignationName"); // 给视图传空的User对象做表单绑定 return View(new User()); } // 如果是用户列表展示页,调整原有Index方法 public ActionResult Index() { // 去掉无效的自引用Include return View(db.Users.Include(us => us.designation).ToList()); } }
2. 视图代码调整
场景一:注册页职位下拉选择(你核心需要的功能)
直接使用强类型绑定生成下拉列表,自动展示职位名称,提交时自动绑定选中的DesignationID:
@model User <div class="form-group"> @Html.LabelFor(model => model.DesignationID, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.DropDownListFor(model => model.DesignationID, (SelectList)ViewBag.DesignationOptions, "请选择职位", new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.DesignationID, "", new { @class = "text-danger" }) </div> </div>
场景二:用户列表页展示对应职位名称
修正属性名的大小写和命名即可:
@model List<User> <div class="form-group"> <label class="control-label col-md-2">用户职位列表</label> <div class="col-md-10"> @foreach (User item in Model) { <p>用户 @item.FirstName @item.LastName 所属职位:@item.designation.DesignationName</p> } </div> </div>
额外注意(DB First模式)
如果你的模型是EF自动生成的,不要直接修改自动生成的partial类文件,新增一个同名的partial类存放自定义逻辑,避免后续从数据库更新模型时把修改覆盖。
内容的提问来源于stack exchange,提问作者Pravania Reddy
相关产品推荐
相关产品推荐

