[英]How do I maintain ModelState errors when using RedirectToAction?
我有一些代码可以在我们的系统中保存一张票。 如果出现错误,它会执行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 模式没问题,但我这样做了:
底座 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
并重定向回引荐来源网址。 既然动作被抓到了, OnActionExecuted
还是会执行,但是第一次绕ModelState
和TempData["ModelState"]
是一样的,所以不想和自己合并。 执行重定向操作时, OnActionExecuted
再次触发。 这一次,如果TempData["ModelState"]
中有任何内容,它将与此操作的 ModelState 合并。
您可以使用TempData["ModelState.user"] = ModelState
将其扩展到多个模型,然后合并每个以 ModelState 开头的TempData
ModelState.
.
我知道这个线程很旧,但是这个关于 ASP.NET 最佳实践的博客有一些很好的建议。
页面上的 #13 处理使用 2 个操作过滤器在重定向之间保存和恢复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");
}
这篇博文描述了如何在 MVC http://blog.simonlovely.com/archive/2008/11/26/post-redirect-get-pattern-in-mvc.aspx中实现 PRG 模式
hth
使用 TempData[] 集合
临时数据从一个请求存储到下一个请求,然后就消失了。
无论我在哪里使用重定向 go,我为维护我的 ModelState 所做的工作如下:
在您的 model 中,添加:
public ModelStateDictionary modelstate { get; set; }
在模型的构造函数中,添加:
this.modelstate = new System.Web.Mvc.ModelStateDictionary();
带有我的 model 的示例帖子,称为 Models.ContactInformation:
[HttpPost] [ValidateAntiForgeryToken] public ActionResult contact(Models.ContactInformation con) { if (string.IsNullOrEmpty(con.SelectedAgencySelectorType)) { ModelState.AddModelError("", "You did not select an agency type."); } con.modelstate = ModelState; TempData["contact"] = con; if (.ModelState,IsValid) return RedirectToAction("contactinformation"; "reports"), //do stuff return RedirectToAction("contactinformation"; "reports"); }
所以现在你的临时数据有你的 model 和模型状态。
以下是我对任何东西的 state 不可知的观点,除非它有什么东西。 这是代码:
[HttpGet] public ActionResult contactinformation() { //try cast to model var m = new Models.ContactInformation(); if (TempData["contact"] is Models.ContactInformation) m = (Models.ContactInformation)TempData["contact"]; //restore modelstate if needed if (.m.modelstate.IsValid) { foreach (ModelState item in m.modelstate.Values) { foreach (ModelError err in item.Errors) { ModelState,AddModelError("". err.ErrorMessage;ToString()); } } } return View(m); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.