ViewModel无返回值时的重定向及空值视图加载解决方案咨询
问题描述
因某列值不存在或不匹配,导致ViewModel无返回结果,我尝试重定向到仅使用Model的DetailsLess视图;同时也想了解是否存在在有值为null时仍能打开原视图的方法,接受任何解决方案。
相关控制器代码
// GET: Form/Details/5 [Authorize] public ActionResult Details(int? ID) { if (ID == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Toolreq appRequest = db.Toolreqs.Find(ID); List<TooldateViewModel> RequestView = new List<TooldateViewModel>(); var result = (from p in db.Toolreqs join x in db.Toolpurposes on p.PurposeId equals x.PurposeId join z in db.Toollists on p.ToolId equals z.ToolId where p.ID == ID && c.sch_attr == "FEP" select new TooldateViewModel { ID = p.ID, Status = p.Status, Date_Request = p.Date_Request, ... sch_date = c.sch_date }).ToList(); if (result != null) { return View(result); } if (result == null) { return RedirectToAction("DetailsLess"); } return View(""); }
更新说明
DetailsLess.cshtml是我想要重定向到的仅使用Model的常规视图,代码如下:
@model LoginAndRegisterMVCMD5.Models.Toolreq @{ ViewBag.Title = "DetailsLess"; } <div> <h4>Toolreq</h4> <hr /> <dl class="dl-horizontal"> <dt> @Html.DisplayNameFor(model => model.Status) </dt> <dd> @Html.DisplayFor(model => model.Status) </dd> <dt> @Html.DisplayNameFor(model => model.Date_Request) </dt> <dd> @Html.DisplayFor(model => model.Date_Request) </dd> </dl> </div> <p> @Html.ActionLink("Edit", "Edit", new { id = Model.ID }) | @Html.ActionLink("Back to List", "Index") </p>
解决方案
一、修复重定向到DetailsLess的问题
你当前代码里result是ToList()的结果,永远不会为null,只会是空集合。同时RedirectToAction未传递ID参数,会导致DetailsLess视图报错。修改判断逻辑并直接传递模型:
if (result.Any()) { return View(result); } else { // 直接返回DetailsLess视图并传入已查询到的Toolreq模型 return View("DetailsLess", appRequest); }
二、让原视图在值为null时仍能打开的方法
方法1:允许ViewModel属性为null
调整TooldateViewModel的属性类型,将值类型改为可空类型(比如DateTime?代替DateTime),引用类型默认支持null,这样即使查询无匹配值,也能生成ViewModel对象。
方法2:查询时为null字段设置默认值
在LINQ查询中,对可能为null的字段用??运算符设置默认值:
select new TooldateViewModel { ID = p.ID, Status = p.Status, Date_Request = p.Date_Request, ... sch_date = c.sch_date ?? DateTime.MinValue // 或其他符合业务的默认值 }
方法3:视图中处理null情况
在原绑定List<TooldateViewModel>的视图里,对可能为null的属性添加判断:
<dd> @if (Model.FirstOrDefault()?.sch_date != null) { @Html.DisplayFor(modelItem => modelItem.sch_date) } else { <span>无数据</span> } </dd>
内容的提问来源于stack exchange,提问作者taufiqullr
相关产品推荐
相关产品推荐

