微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的ModelState错误没有显示在视图上?

如何解决为什么我的ModelState错误没有显示在视图上?

我按照[这里的答案] [1]做了与ModelState和错误有关的事情,但由于我仍未在页面上看到错误,我认为我缺少了一些东西。

private ApplicationDbContext db = new ApplicationDbContext();

// GET: User
[HttpGet]
[Route("Create/{token}",Name = "Create")]
public async Task<ActionResult> Create(string token)
{
    try
    {
        if (TempData["err"] != null)
        {
            ModelState.AddModelError("",TempData["err"] as Exception);
            TempData.Clear();
            return View();
        }
        else
        {
            token = "foobar"; // For testing to force an error.
            var municipality = await db.Municipalities.SingleAsync(x => x.OneOffToken == token);
            return View(municipality);
        }
    }
    catch (Exception ex)
    {
        TempData["err"] = ex;
        return View();
    }
}

这会按预期将模型错误添加到ModelState中,但是如何准确地将错误显示在View上?当我测试页面时,我看不到任何错误的迹象,除了视图上绝对没有任何东西(按预期,尽管错误消息会很好)。

解决方法

根据史蒂夫·格林(Steve Greene)对问题的评论,我在视图上使用了ValidationSummary来显示自定义错误。

这涉及将ValidationSummary添加到视图:

@Html.ValidationSummary(false,"",new { @class = "text-danger" })

稍稍更改了后端逻辑,以将异常的message实际放入ModelState:

if (TempData["err"] != null) {
    // Cast the object in TempData to an exception.
    var ex = TempData["err"] as Exception;

    // Add to ModelState.
    ModelState.AddModelError("err",ex.Message);

    // Clear TempData so we don't get stuck here.
    TempData.Clear();

    return View();
}
else {
    // There's no error so normal page initialization can go here.
}

值得注意的是,catch在设置TempData之后应该RedirectToAction,因为返回的View的ModelState中不会包含ModelError,因此要显示错误,实际上在页面出现后手动刷新。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。