2

我有一個自定義屬性,目前是DataAnnotations.RequiredAttribute(我會稍後擴展它,但只是試圖讓這個概念證明現在工作)的簡單包裝。但是,這不適用於MVC3不顯眼的驗證。MVC3不顯眼的驗證不工作的自定義DataAnnotations屬性

這真是一個非常簡單的問題。

這裏是我的自定義屬性:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] 
public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute 
{ 
    public RequiredAttribute() 
    { 
    } 

    public RequiredAttribute(Type errorMessageResourceType, string errorMessageResourceName) 
    { 
     this.ErrorMessageResourceName = errorMessageResourceName; 
     this.ErrorMessageResourceType = errorMessageResourceType; 
    } 
} 

以下是使用自定義屬性的兩個模特屬性,一個,一個使用DataAnnotations屬性:

[System.ComponentModel.DataAnnotations.Required] 
public string FirstName { get; set; } 

[CustomValidationAttributes.Required] 
public string LastName { get; set; } 

下面是剃刀代碼:

<p> 
    @Html.TextBoxFor(model => model.FirstName) 
    @Html.ValidationMessageFor(model => model.FirstName) 
</p> 
<p> 
    @Html.TextBoxFor(model => model.LastName) 
    @Html.ValidationMessageFor(model => model.LastName) 
</p> 

這裏是結果輸出:

<p> 
    <input type="text" value="" name="FirstName id="FirstName" data-val-required="The First Name field is required." data-val="true"> 
    <span data-valmsg-replace="true" data-valmsg-for="FirstName" class="field-validation-valid"></span> 
</p> 
<p> 
    <input type="text" value="" name="LastName" id="LastName"> 
    <span data-valmsg-replace="true" data-valmsg-for="LastName" class="field-validation-valid"></span> 
</p> 

因此,大家可以看到,名字(使用DataAnnotations)呈現與所需驗證必要的HTML屬性,但姓氏(使用CustomValidationAttributes)缺少data-val-requireddata-val attributes

我做錯了什麼,或者這不支持與MVC3不顯眼的驗證?

在此先感謝。

+1

你可以在這裏找到http://stackoverflow.com/questions/6495510/mvc-2-vs-mvc-3-您的解決方案custom-validation-attributes-using-dataannotationsmodelvalidatorpr – ingo

+0

@ingo - 雖然我很困惑。如果我沒有擴展基礎驗證,爲什麼我必須通過實現'IsValid'和'GetClientValidationRules'來「重新發明輪子」,如果這些實現已經存在並且適用於基本驗證屬性(在這種情況下爲'RequiredAttribute')? –

回答

4

正如ingo在評論中指出的那樣,我最終不得不實施IClientValidatable才能使這些工作成功。所以,在我上面的例子中,我不得不把它添加到我的屬性:

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

     yield return modelClientValidationRule; 
    } 
+2

我剛剛寫了一篇關於創建自定義ValidationAttribute的博客,以及如何將其轉換爲不顯眼的驗證。該示例位於[github](https://github.com/jimschubert/ContainsAttributeExample)上,並與我製作的屬性一起使用,這將需要您的字符串屬性包含指定的單詞或短語。你也可以使用'RequiredAttributeAdapter'註冊你自定義的'RequiredAttribute' [見這裏](https://github.com/jimschubert/ContainsAttributeExample/blob/master/ContainsUnobtrusiveExample/Global.asax.cs#L39) –

+0

@JimSchubert你能鏈接到博客文章? –

+0

@AnnL。該帖子在github頁面的摘要中鏈接。這是,以防萬一:http://www.ipreferjim.com/?p=606 –

相關問題