c# - 使用 RedirectToAction 时如何维护 ModelState 错误?

标签 c# asp.net asp.net-mvc

我有一些代码可以在我们的系统中保存票证。如果出现错误,它会执行 RedirectToAction()。问题是我在新 Action 中似乎没有错误。我该如何解决这个问题?

 ModelState.AddModelError("_FORM", "Unable to save ticket");
 ModelState.AddModelError("_FORM", "Phone number was invalid.");
 ModelState.AddModelError("_FORM", "Lane number is required.");
 return RedirectToAction("CreateStep", "Ticket");

我知道有些人建议使用 TempData,但我如何从 ModelState 中找出每个错误?

谢谢。

最佳答案

PRG 模式没问题,但我这样做了:

基础 Controller :

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    if (TempData["ModelState"] != null && !ModelState.Equals(TempData["ModelState"]))
        ModelState.Merge((ModelStateDictionary)TempData["ModelState"]);

    base.OnActionExecuted(filterContext);
}

操作(我正在使用 xVal ):

try
{
    user.Login();
    AuthenticationManager.SignIn(user);
}
catch (RulesException rex)
{
    // on bad login
    rex.AddModelStateErrors(ModelState, "user");
    TempData["ModelState"] = ModelState;
    return Redirect(Request.UrlReferrer.ToString());
}

该操作抛出异常,将 ModelState 添加到 TempData 并重定向回 referrer。由于 Action 被捕获,OnActionExecuted 仍然被执行,但是第一次围绕 ModelStateTempData["ModelState"] 相同,所以你不想与自己融合。执行重定向操作时,OnActionExecuted 再次触发。这一次,如果 TempData["ModelState"] 中有任何内容,它将与此操作的 ModelState 合并。

您可以使用 TempData["ModelState.user"] = ModelState 将其扩展到多个模型,然后合并以 ModelState 开头的每个 TempData 对象。

关于c# - 使用 RedirectToAction 时如何维护 ModelState 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/658747/

相关文章:

asp.net - 在 web.config 中授权属性与授权节点

c# - 安装 .NET 4.5 后的 ClaimsIdentity NullReferenceException

c# - 为什么要在 web api 中指定路由参数类型?

c# - Entity Framework 核心 : Access parent from child

c# - 如何使用一个 xml 文件中的信息在 C# 中创建另一个文件?

c# - 解密 cookie 会将其转换为本地时间吗?

jquery - 消除部分 View MVC 3 Razor 中的重复 ID

c# - 无法从正在运行的Task中执行方法

c# - .NET 服务器垃圾回收和对象生命周期

c# - 当第一行是字符串时,GetValue() 不读取十进制值