[英]MVC Model Validation Unobtrusive
我正在使用jquery不干擾方法在UI中驗證我的模型。 我在模型中有一個數字字段,需要驗證為數字。 開箱即用,它幾乎可以正常工作。 驗證.33與0.33時,它在客戶端失敗。 我知道我可以在jquery驗證插件中更改正則表達式,但這似乎並不理想。
因此,為了嘗試解決此問題而不修改插件本身,我創建了以下驗證屬性:
public class DecimalValidator : System.ComponentModel.DataAnnotations.ValidationAttribute, System.Web.Mvc.IClientValidatable
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
decimal val = 0;
ValidationResult ret = new ValidationResult("Must be a valid decimal");
if (decimal.TryParse(value.ToString(), out val) )
return ValidationResult.Success;
else
return ret;
}
#region IClientValidatable Members
public System.Collections.Generic.IEnumerable<System.Web.Mvc.ModelClientValidationRule> GetClientValidationRules(System.Web.Mvc.ModelMetadata metadata, System.Web.Mvc.ControllerContext context)
{
List<System.Web.Mvc.ModelClientValidationRule> ret = new List<System.Web.Mvc.ModelClientValidationRule>();
System.Web.Mvc.ModelClientValidationRule validDecimalRule = new System.Web.Mvc.ModelClientValidationRule
{
ErrorMessage = "Please enter a valid decimal.",
ValidationType = "decimal"
};
ret.Add(validDecimalRule);
return ret;
}
#endregion
}
並像這樣應用它:
/// <summary>
/// The price per unit.
/// </summary>
[Range(0, double.MaxValue)]
[Display(Name = "Price")]
[DecimalValidator]
public decimal UnitPrice { get; set; }
問題是html仍然使用data-val-number =“字段Price必須是數字。” 除了新的之外,data-val-decimal =“請輸入一個有效的十進制。”
如何保持默認的驗證屬性不被渲染?
我相信[Range(0, double.MaxValue)]
強迫它加載數字驗證。 嘗試將其添加到自定義驗證器中,然后將其從字段裝飾器中刪除。
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
decimal val = 0;
ValidationResult ret = new ValidationResult("Must be a valid decimal");
ValidationResult rangeRet = new ValidationResult(String.Format("Number must be between 0 and {0}", double.MaxValue.ToString());
if (decimal.TryParse(value.ToString(), out val) )
return ValidationResult.Success;
else if (value < 0 || value > double.MaxValue)
return rangeRet;
else
return ret;
}
我發現答案是使用$ .extend用允許.33和0.33的正則表達式替換插件中的數字驗證
為什么要創建自定義驗證器? 默認情況下,MVC將為您驗證。 如果將類型設為可空(十進制?),則MVC將在輸入非十進制的情況下將UnitPrice設置為null,並且如果模型狀態違反您正在執行的任何其他驗證,則將使模型狀態無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.