You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:51:09