使用ViewModel显示下拉列表失效问题排查
排查ASP.NET MVC中ViewModel切换后异常的问题
嘿,我来帮你搞定这个ViewModel替换ViewBag后出异常的问题!结合你用Code First对接现有数据库的场景,大概率是ViewModel的定义、数据传递或者视图绑定环节出了小问题,我给你梳理几个常见坑和解决步骤:
1. 先检查ViewModel的定义是否合理
你当前的实体类APPET1是EF反向生成的partial类(因为对接现有数据库),ViewModel需要独立定义,要包含视图需要的属性,和实体类属性匹配(类型、名称一致)。比如你可以这样写:
// 放在ViewModels文件夹下的独立类 public class APPET1ViewModel { [Display(Name = "Doc Number")] // 可选,用来在视图显示友好名称 public string Doc_Number { get; set; } public string CCod { get; set; } // 视图需要的其他属性都要加上 }
注意:ViewModel不是EF实体,不要加EF的特性(比如[Column]),除非你有特殊需求,它只负责传递视图需要的数据。
2. 控制器中正确传递ViewModel到视图
之前用ViewBag的时候,你可能直接把实体数据塞到ViewBag里,换成ViewModel需要先查询实体,再把实体数据映射到ViewModel,不能直接把实体传给视图(除非你的ViewModel和实体完全一致,但不建议)。示例代码:
public ActionResult YourActionName() { // 先从数据库查询实体数据 var appetEntity = db.APPET1.FirstOrDefault(); // 或者用你需要的查询逻辑 // 实例化ViewModel,处理实体为空的情况(避免空引用异常) var viewModel = new APPET1ViewModel(); if (appetEntity != null) { // 把实体属性赋值给ViewModel viewModel.Doc_Number = appetEntity.Doc_Number; viewModel.CCod = appetEntity.CCod; // 其他属性依次赋值 } // 把ViewModel传给视图 return View(viewModel); }
这里最容易踩的坑是:没实例化ViewModel就直接返回,或者实体为空时没处理,导致视图访问@Model属性时报空引用异常。
3. 视图中正确绑定强类型ViewModel
视图开头必须声明强类型,确保你引用的是ViewModel,而不是实体类,示例:
@model YourProjectNamespace.ViewModels.APPET1ViewModel <div class="container"> <p>单据编号: @Model.Doc_Number</p> <p>CCod: @Model.CCod</p> </div>
如果这里写错了模型命名空间,或者属性名和ViewModel里的不一致,就会报错。比如你如果写成@Model.DocNumber(少了下划线),就会找不到属性。
常见异常的快速定位
- 空引用异常:检查控制器是否实例化了ViewModel,或者实体查询是否返回null后没处理。
- 模型绑定错误/找不到属性:对比ViewModel的属性名和视图里的引用是否完全一致,类型是否匹配(比如实体是string,ViewModel不能写成int)。
- EF相关异常:别把ViewModel当成EF实体来查询(比如
db.Set<APPET1ViewModel>().ToList()),ViewModel不是EF的实体类,只能先查实体再映射。
如果有具体的错误提示,可以把异常信息贴出来,能更快定位问题哦!
内容的提问来源于stack exchange,提问作者PhatLee
相关产品推荐
相关产品推荐

