ASP.NET MVC ViewModel传递到View时类型不匹配及属性找不到问题
问题原因
两个报错本质都是控制器传递的模型类型和视图声明的模型类型不匹配导致的:
- 你查询的是指定id的单条审批请求,控制器却返回了
List<ReportViewModel>集合类型 - 视图虽然声明了接收
IEnumerable<ReportViewModel>集合,却直接按单个ReportViewModel对象调用属性,自然找不到对应属性
解决步骤
1. 修改控制器代码
你根据固定id查询AppRequest,结果只会有一条,不需要返回集合:
把查询语句最后的.ToList()改为.FirstOrDefault(),直接返回单个ReportViewModel对象即可,修改后代码如下:
public ActionResult Index(int id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } AppRequest appRequest = db.AppRequest.Find(id); if (appRequest == null) { return HttpNotFound(); } if (appRequest.General.Count != 0) { var ReqDetails = (from a in db.AppRequest join e in db.CreateEmployee on a.Req_By equals e.Id join c in db.CreateCompany on e.CompanyId equals c.Id join d in db.CreateDesignation on e.DesignId equals d.Id join dep in db.CreateDepartment on e.DepId equals dep.Id where a.Id == id select new ReportViewModel { RequestedDate = a.Req_Date.ToString(), RequestBy = e.EmpName, CompanyName = c.CompanyName, RequestByDessignation = d.Designation, RequestByDepartment = dep.Department, GeneralItemsApprovedList= (from a in db.AppRequest join g in db.General on a.Id equals g.Req_Id join gi in db.GeneralItms on g.Id equals gi.General_Id where a.Id == id select new GeneralItemsApprovedList { Attachment = gi.Attachment, ItemDescription = gi.Attachment_Description, ItemPrice = gi.Attachment_Amount.ToString() }).ToList(), ApprovalList = (from a in db.AppRequest join ap in db.ApprovalProcess on a.Id equals ap.Req_Id join pa in db.ApproveParties on ap.Id equals pa.ApprovalProcess_Id join ae in db.CreateEmployee on pa.Approver_Id equals ae.Id join ad in db.CreateDesignation on ae.DesignId equals ad.Id where a.Id == id select new ApprovalList { ApproveDate = pa.Approved_Date.ToString(), ApprovedBy = ae.EmpName, ApprovedByDessignation = ad.Designation, }).ToList() }).FirstOrDefault(); // 此处将ToList改为FirstOrDefault if (ReqDetails == null) { return HttpNotFound(); } return View("ApprovedReport", ReqDetails); } return View(""); }
2. 修改视图声明的模型类型
把视图顶部的模型声明从集合类型改为单个ReportViewModel类型:
@model Asp_PASMVC.ViewModels.ReportViewModel @{ Layout = "~/Views/Shared/_Layout.cshtml"; }
3. 调整视图属性调用
修改后视图的Model就是单个ReportViewModel对象,原来的@Html.DisplayFor(model => model.RequestBy)和@foreach (var item in Model.ApprovalList)的写法都可以正常运行,不需要额外修改。
内容的提问来源于stack exchange,提问作者smc develpments
相关产品推荐
相关产品推荐

