当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用RedirectToAction时如何维护ModelState错误?》经验,为你挑选了2个好方法。

我有一些代码可以在我们的系统中保存一张票.如果有错误,它会执行RedirectToAction.问题是我似乎没有在新动作中出现错误.我怎样才能解决这个问题?

 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中获取每个错误?

谢谢.



1> 小智..:

PRG模式还可以,但我这样做了:

基础控制器:

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并重定向回引用者.由于捕获了动作,OnActionExecuted仍然执行,但ModelState第一次与TempData ["ModelState"]相同,因此您不想与自己合并.执行重定向操作时,OnActionExecuted再次触发.这一次,如果TempData ["ModelState"]中有任何内容,它会与此动作的ModelState合并.

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


@法案.我喜欢它.我已扩展您的代码以供我使用.而不是你的RulesException.AddModelStateErrors(),我做了另一种方式,我扩展ModelState有两个扩展方法; UpdateModel和RestoreModel.为你+1.

2> Scott Rippey..:

我知道这个帖子已经过时了,但是关于ASP.NET最佳实践的博客有一些很好的建议.
页面上的#13处理使用2个Action过滤器ModelState在重定向之间进行保存和恢复.

这是我的作品使用的模式,我喜欢它.

这是简化的例子:

[ImportModelStateFromTempData]
public ActionResult Dashboard()
{
    return View();
}

[AcceptVerbs(HttpVerbs.Post), ExportModelStateToTempData]
public ActionResult Dashboard(string data)
{
    if (ValidateData(data))
    {
        try
        {
            _service.Submit(data);
        }
        catch (Exception e)
        {
            ModelState.AddModelError(ModelStateException, e);
        }
    }

    return RedirectToAction("Dashboard");
}


链接坏了:(
推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有