簡體   English   中英

使用 RedirectToAction 時如何維護 ModelState 錯誤?

[英]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還是會執行,但是第一次繞ModelStateTempData["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 所做的工作如下:

  1. 在您的 model 中,添加:

     public ModelStateDictionary modelstate { get; set; }
  2. 在模型的構造函數中,添加:

     this.modelstate = new System.Web.Mvc.ModelStateDictionary();
  3. 帶有我的 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"); }
  4. 所以現在你的臨時數據有你的 model 和模型狀態。

  5. 以下是我對任何東西的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM