[英]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.