2010-09-14 96 views
0

我有一類這個屬性:ASP.NET MVC 2的數值驗證

public virtual decimal? Number { get; set; } 

當我使用它在窗體上,MVC會自動驗證它。如果用戶輸入一個字母,自然會返回一個錯誤:

「值'D'對Number無效。」

如何更改此類錯誤消息甚至控制該行爲?我沒有找到相關的屬性或類似的東西。

謝謝!

回答

0

它實際上不是從模型驗證派生出來的消息。當模型聯編程序無法將輸入值轉換爲綁定屬性的值類型時,消息將添加到模型狀態。例如,當綁定屬性爲整數並且用戶在該屬性的輸入字段中輸入非數字字符時,可能會發生這種情況。

要重寫消息,您將不得不以「硬」的方式執行該操作,即擴展DefaultModelBinder類並覆蓋SetProperty方法。這裏有一個例子:

public class MyModelBinder: DefaultModelBinder 
{ 
    public MyModelBinder() 
    { 
    } 

    protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value) 
    { 
     string key = bindingContext.ModelName + "." + propertyDescriptor.Name; 
     if (bindingContext.ModelState[key] != null) 
     { 

      foreach (ModelError error in bindingContext.ModelState[key].Errors) 
      { 
       if (IsFormatException(error.Exception)) 
       { 
        bindingContext.ModelState[key].Errors.Remove(error); 
        bindingContext.ModelState[key].Errors.Add(string.Format("My message for {0}.", propertyDescriptor.DisplayName)); 
        break; 
       } 
      } 
     } 
     base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value); 
    } 

    private bool IsFormatException(Exception e) 
    { 
     while (e != null) 
     { 
      if (e is FormatException) 
      { 
       return true; 
      } 
      e = e.InnerException; 
     } 
     return false; 
    } 
} 
0

簡單的使用給定的範圍驗證豐達,你會得到你想要

什麼對於任何數量的確認必須使用不同的不同範圍的驗證,按您的要求:

對於整數

[Range(0, int.MaxValue, ErrorMessage = "Please enter valid integer Number")] 

浮法

[Range(0, float.MaxValue, ErrorMessage = "Please enter valid float Number")] 

[Range(0, double.MaxValue, ErrorMessage = "Please enter valid doubleNumber")] 
+0

@fedorui感謝編輯的。這將更容易理解。但它是否有用? – Dilip0165 2013-06-27 08:22:39