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

时间:2020-09-26 16:25:07

标签: c# asp.net-mvc

我按照[这里的答案] [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上?当我测试页面时,我看不到任何错误的迹象,除了视图上绝对没有任何东西(按预期,尽管错误消息会很好)。

1 个答案:

答案 0 :(得分:0)

根据史蒂夫·格林(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,因此要显示错误,实际上在页面出现后手动刷新。

相关问题