2015-04-07 49 views
0

在下面的代碼片段中,您會用什麼來代替TempData以實現相同的預期結果 - 在無效的ModelState情況下重定向並傳遞登錄錯誤?如何在不使用TempData的情況下實現相同的結果

public ActionResult Welcome(string returnUrl, int accountTypeId = 0) 
    { 
     //this is logic from the original login page. not sure if this would ever occur. we may be able to remove this. 
     if (string.IsNullOrEmpty(returnUrl) == false && returnUrl.Contains("?route=")) 
     { 
      var split = returnUrl.Split(new[] {"?route="}, StringSplitOptions.None); 
      var route = Server.UrlDecode(split[1]); 
      returnUrl = split[0] + "#" + route; 
     } 

     object model; 
     if (TempData.TryGetValue("LogOnModel", out model) == false) 
     { 
      model = new LogOnModel 
      { 
       ReturnUrl = returnUrl, 
       AccountTypeId = accountTypeId 
      }; 
     } 

     object errors; 
     if (TempData.TryGetValue("Errors", out errors)) 
     { 
      ModelState.Merge(errors as ModelStateDictionary); 
     } 

     return View(model); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Welcome(LogOnModel model) 
    { 
     Func<ActionResult> invalid =() => 
     { 
      TempData.Add("Errors", ModelState); 
      TempData.Add("LogOnModel", model); 
      return RedirectToAction("Welcome"); 
     }; 

     if (ModelState.IsValid == false) 
     { 
      return invalid(); 
     } 

正如目前的情況是,如果用戶點擊後退按鈕和嘗試登錄在第二時間代碼創建一個錯誤。錯誤消息「具有相同密鑰的項目已被輸入」我試圖避免此錯誤。我嘗試在TempData的地方使用ViewData,但是在有人輸入錯誤密碼的情況下,這打破了我的登錄錯誤消息。我是MVC的新手,所以我正在尋求其他人的意見。

回答

0

它看起來並不像你正在做的任何Ajax,所以你不需要在這種情況下重定向錯誤。當模型狀態無效時,您會爲您填充稱爲模型狀態錯誤的集合。您只需要再次返回歡迎頁面並將@ Html.ValidationSummary添加到歡迎頁面cshtml。

Html.ValidationSummary讀取模型狀態錯誤,然後確定是否需要顯示錯誤框。這是我會做的。

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Welcome(LogOnModel model) 
{ 
    if (ModelState.IsValid == false) 
    {//We have model state errors populated here for us 
     return View(model); 
    } 
    //Do Work 
} 
相關問題