2011-11-17 38 views
7

我正在開發一個使用MVC控制器的REST API。我想處理所有模型綁定錯誤,並以用戶友好的方式向客戶報告。在我的自定義模型綁定器中,我已經拋出了異常處理程序認爲安全的特殊異常,並向客戶端顯示。可靠地處理ASP.NET MVC模型綁定錯誤

然而,當默認的模型粘合劑看到一個無效值(比方說,asdfint)似乎要麼完全忽略它(如果該參數不是必需的),或者拋出一個普通的ArgumentException(如果需要的參數)。是否可以可靠地處理這兩種情況並獲取參數名稱和相關錯誤,而無需手動重寫整個聯編程序?

我寧願不按原樣顯示ArgumentException,因爲它揭示了客戶端不應該關心的方法和名稱空間名稱。如果它是可以避免的,我也不會解析ArgumentException消息,並且這不會解決非完整忽略的非必需參數的無效值問題。

+0

你有沒有找到一個好的解決方案?我正在考慮裝飾或繼承'IModelBinder',但我想知道是否有更好的方法。 –

+0

@FabianSchmied:可惜沒有。 「Web API」模型綁定器可能對這種情況有更好的支持 - 我不瞭解ASP.NET Core。 –

回答

3

您可以在模型上實現IValidatableObject接口。您可以創建自己的驗證邏輯,替換當前擁有的Required屬性驗證。

public class Model : IValidatableObject { 
    public int MyIntProperty { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { 
     if (MyIntProperty == 0) { 
      yield return new ValidationResult("Please provide a valid value for MyIntProperty.", new[] { "MyIntProperty" }); 
     } 
    } 
} 

在您的控制器中,您可以檢查ModelState.Errors集合以查看驗證錯誤。此外,如果您使用強類型視圖和HTML表單助手,這將在客戶端生成錯誤CSS類。