2010-09-22 61 views
6

AddModelError()的過載有什麼用處,它將一個Exception作爲參數?ModelState.AddModelError的用途,但有異常參數

如果我包括在我的控制器下面的代碼:

ModelState.AddModelError("", new Exception("blah blah blah")); 
ModelState.AddModelError("", "Something has went wrong"); 

if (!ModelState.IsValid) 
    return View(model); 

在我看來,以下幾點:

<%= Html.ValidationSummary("Please correct the errors and try again.") %> 

則僅調整文本「有些事情已經出了問題」顯示錯誤概要。

回答

3

檢查源模型錯誤接受兩者,用法用於模型類型轉換失敗。

在這種特殊情況下,它會沿着異常樹並抓取內部異常,以便查找實際根錯誤而不是通用頂級異常消息。

foreach (ModelError error in modelState.Errors.Where(err => String.IsNullOrEmpty(err.ErrorMessage) && err.Exception != null).ToList()) { 
    for (Exception exception = error.Exception; exception != null; exception = exception.InnerException) { 
     if (exception is FormatException) { 
      string displayName = propertyMetadata.GetDisplayName(); 
      string errorMessageTemplate = GetValueInvalidResource(controllerContext); 
      string errorMessage = String.Format(CultureInfo.CurrentCulture, errorMessageTemplate, modelState.Value.AttemptedValue, displayName); 
      modelState.Errors.Remove(error); 
      modelState.Errors.Add(errorMessage); 
      break; 
     } 
    } 
} 

正如您可以看到它循環遍歷ModelError中的異常以查找FormatException。這是我在MVC 2和MVC 3中唯一可以找到的真實參考。

這就是說這可能不需要經常使用。

+1

我注意到MVC 3似乎沒有在ValidationSummary中包含異常,不知道它是一個錯誤還是設計 - 儘管如此,它們應該在文檔中明確說明。我嘗試傳遞新的FormatException(「某事」) - 也沒有工作。 – 2013-01-21 08:58:00