2011-03-06 152 views
43

我在我的控制器中有這個功能。如果ModelState.IsValid失敗,將獲取錯誤消息?

[HttpPost] 
public ActionResult Edit(EmployeesViewModel viewModel) 
{ 
    Employee employee = GetEmployee(viewModel.EmployeeId); 
    TryUpdateModel(employee); 

    if (ModelState.IsValid) 
    { 
     SaveEmployee(employee); 
     TempData["message"] = "Employee has been saved."; 
     return RedirectToAction("Details", new { id = employee.EmployeeID }); 
    } 

    return View(viewModel); // validation error, so redisplay same view 
} 

它一直失敗,ModelState.IsValid一直返回false並重新顯示視圖。但我不知道錯誤是什麼。

有沒有辦法讓錯誤重新顯示給用戶?

回答

24

您可以在您的視圖中執行此操作,而無需執行任何特殊的操作,方法是使用Html.ValidationSummary()顯示所有錯誤消息,或Html.ValidationMessageFor()顯示模型特定屬性的消息。

如果您仍然需要從你的行動或控制器中出現的錯誤,請參閱ModelState.Errors財產

+1

沒有ModelState.Errors屬性?! – niico 2017-11-19 15:10:09

+0

@niico我認爲他意味着「ModelState」類型的屬性,而Controller.ModelState屬性的類型是ModelStateDictionary。 – devlord 2018-03-02 17:24:40

0

我不知道,如果這是你的問題,但如果你添加一個用戶,然後更改的名稱你應用程序,該用戶將保留在數據庫中(當然),但將是無效的(這是正確的行爲)。但是,這種類型的故障不會添加任何錯誤。錯誤列表爲空,但對於登錄,ModelState.IsValid將返回false。

86

試試這個

if (ModelState.IsValid) 
{ 
    //go on as normal 
} 
else 
{ 
    var errors = ModelState.Select(x => x.Value.Errors) 
          .Where(y=>y.Count>0) 
          .ToList(); 
} 

錯誤將所有錯誤的列表。

+1

完美答案。非常感謝! – 2017-08-08 07:31:15

45

如果你正在尋找生成包含ModelState錯誤信息,您可以使用SelectMany到錯誤壓扁成一個單一的列表中的單個錯誤消息字符串:

if (!ModelState.IsValid) 
{ 
    var message = string.Join(" | ", ModelState.Values 
     .SelectMany(v => v.Errors) 
     .Select(e => e.ErrorMessage)); 
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message); 
} 
+7

有時候沒有提供'ErrorMessage',例如如果未設置所需的「DateTime」字段。在這種情況下,查找異常消息,例如'e.Exception.Message'。 – WhatIsHeDoing 2015-04-09 12:43:41

1

如果模態是無效&的錯誤無法在屏幕上看到,因爲您的控件處於摺疊式手風琴中,那麼您可以返回HttpStatusCode,以便在執行F12時顯示實際的錯誤消息。您也可以將此錯誤記錄到ELMAH錯誤日誌中。以下是密碼

if (!ModelState.IsValid) 
{ 
       var message = string.Join(" | ", ModelState.Values 
              .SelectMany(v => v.Errors) 
              .Select(e => e.ErrorMessage)); 

       //Log This exception to ELMAH: 
       Exception exception = new Exception(message.ToString()); 
       Elmah.ErrorSignal.FromCurrentContext().Raise(exception); 

       //Return Status Code: 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest, message); 
} 

但請注意,此代碼將記錄所有驗證錯誤。因此,只有在屏幕上看不到錯誤的情況下才能使用。

0

確定檢查並添加看點:

  1. 在你的代碼在你的ModelState線做一個斷點
  2. 添加您的模型狀態到您的收藏
  3. 展開的ModelState「值」
  4. 展開值「結果視圖」

現在,您可以在值的結尾處看到所有具有驗證狀態的SubKey的列表。

因此搜索無效值

相關問題