2013-06-19 107 views
1

新手來MVC3和jQuery的不顯眼的驗證。我想爲我的mvc視圖模型屬性實現一個非常簡單的自定義字符串驗證。我知道有一個現有的「必需」屬性,但想要玩我的習慣用於測試目的。MVC3自定義字符串客戶端驗證不起作用

這裏是我的自定義驗證器類:

public class StringRequiredAttribute : ValidationAttribute, IClientValidatable 
{ 
    public override bool IsValid(object value) 
    { 
     string valueToValidate = value.ToString(); 

     if ((value == null) || (valueToValidate.IsEmpty())) 
     { 
      return false; 
     } 

     return true; 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return "formatting my custom message here..."; 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule 
     { 
      ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), 
      ValidationType = "stringrequired" 
     }; 

     yield return rule; 
    } 
} 

這裏是視圖模型類屬性聲明:

[Display(Name = "Custom Property")] 
[StringRequired(ErrorMessage="My custom error message goes here")] 
public string MyProperty { get; set; } 

這裏是我的腳本:

jQuery.validator.unobtrusive.adapters.add('stringrequired', [], function (options) { 
    options.rules['stringrequired'] = true; 
    options.messages['stringrequired'] = options.message; 
} 
); 

jQuery.validator.addMethod('stringrequired', function (value, element, params) { 
    //problem is this method is never fired 
    if (value == undefined || value == null) 
     return false; 

    if (value.toString().length == 0) 
     return false; 

    return true; 
},''); 

這是我的HTML標記:

<textarea cols="20" data-val="true" data-val-stringrequired="My custom message is 
displayed here" id="MyProperty" name="MyProperty" rows="2"> 
</textarea> 

我已經ClientValidationEnabled & UnobtrusiveJavaScriptEnabled在web.config中

出於某種原因,這是行不通的設置爲「真」。希望在這裏幫助。謝謝!

+0

什麼是不工作?錯誤訊息?無事例外? – Jay

+0

@Jay See'//問題是這個方法永遠不會被觸發' – AaronLS

+0

嘗試使用'@ Html.TextAreaFor <>'來呈現標記,並確保您正在加載對jQuery不顯眼庫的引用。 – Jay

回答

1

以爲我會加我2美分。

我創建了一個演示項目和litterally複製並粘貼您的代碼,它爲我工作。然而,不得不將valueToValidate.IsEmpty()更改爲String.IsNullOrEmpty(valueToValidate)

唯一的區別就是我的觀點(因爲你沒有顯示你的):

@model Test.Models.MyClass 
@{ 
    ViewBag.Title = "Home Page"; 
} 
@using (Html.BeginForm("Post", "Home", FormMethod.Post)) 
{ 
    @Html.TextAreaFor(x=>x.MyProperty) 
    @Html.ValidationMessageFor(x=>x.MyProperty) 

    <input type="submit" value="submit" id="Submit" /> 
} 

確保我引用: jQuery的,jQuery.Validate,jQuery.Validate.Unobtrusive(順序)

和您的驗證上述JavaScript是這個

最後,我再次重申,因爲它竊聽我幾個小時後叫

如果在相同視圖的驗證附近沒有表單,則MVC將不會將正確的驗證信息寫入響應。

有一種方法來創建一個虛擬FormContext到ViewContext,基本上把這個線你的局部視圖頂部但是強制此:

ViewContext.FormContext = new FormContext(); 

這將誘使MVC進入抽不出來驗證的東西

Reference