2011-06-24 103 views
2

我的模型整數輸入:驗證使用掩模(ASP .NET MVC 3.0)

public virtual int? NumberTest { get; set; } 

我查看

@Html.LabelFor(model => model.NumberTest) 
<br /> 
@Html.TextBoxFor(model => model.NumberTest) 

我使用Masked Input Plugin,所以我有我的觀點:

$("#NumberTest").mask("99999-999"); 

我生成的Html:

<input data-val="true" data-val-number="The field NumberTest must be a number." id="NumberTest" name="NumberTest" type="text" value="" /> 

所以自動生成對我的整數輸入數字驗證...而我使用的口罩用非整數的char格式號碼....

這validatior總是叫我填輸入...我該如何解決這個問題?

+0

看起來像面具中的' - '正在拋出驗證器。 –

+0

是的...所以,解決這個問題的唯一方法是不使用任何分隔符? – Paul

+0

在我的情況下,我有一個'decimal'屬性,並且我的掩碼是£99999',英鎊符號引發MVC的默認前端驗證。有沒有簡單的方法呢? – Ciwan

回答

4

我所做的是將數據類型設置爲字符串,以便它可以與maskedinput一起使用,但是隨後在自定義模型綁定器中,我刪除了所有非數字字符,以便它可以以int形式保存到數據庫。您仍然可以獲得客戶端和服務器端的保護,因爲用戶無法通過maskedinput客戶端輸入非數字字符,並且可能會將錯誤的字符過濾掉。

這裏的自定義模型綁定代碼:

public class CustomModelBinder : DefaultModelBinder 
{ 
    protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value) 
    { 
     if (value != null && propertyDescriptor.PropertyType == typeof(string)) 
     { 
      // always trim strings to clean up database padding 
      value = ((string)value).Trim(); 

      if ((string)value == string.Empty) 
      { 
       value = null; 
      } 
      else if ((propertyDescriptor.Attributes[typeof(PhoneNumberAttribute)] != null 
       || propertyDescriptor.Attributes[typeof(ZipCodeAttribute)] != null 
       || propertyDescriptor.Attributes[typeof(SocialSecurityNumberAttribute)] != null) 
       && bindingContext.ValueProvider.GetValue(propertyDescriptor.Name) != null 
       && bindingContext.ValueProvider.GetValue(propertyDescriptor.Name).AttemptedValue != null) 
      { 
       value = 
        Regex.Replace(bindingContext.ValueProvider.GetValue(propertyDescriptor.Name).AttemptedValue, 
            "[^0-9]", ""); 
      } 
     } 

     base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value); 
    } 
} 

的自定義屬性都只是空的屬性:

public class ZipCodeAttribute : Attribute { } 

在視圖模型,只是標誌着你的領域是這樣的:

[ZipCode] 
public string Zip { get; set; } 

以下是如何做whole thing with maskedinput, editor templates and unobtrusive validation