我有一些代码可以在我们的系统中保存一张票.如果有错误,它会执行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中获取每个错误?
谢谢.
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对象.
我知道这个帖子已经过时了,但是关于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"); }