2011-03-29 115 views
0

我正在處理MVC3 web應用程序,我的模型包含許多使用文本屬性的自定義類型的類。 例如我的產品實體的樣子:使用DataAnnotations或CustomValidation驗證模型的子屬性

public class Product 
{ 
    public int ProductId {get;set;} 
    public TextRef Title {get;set;} 
    public TextRef Description {get;set;} 
} 

和TEXTREF是:

public class TextRef 
{ 
    public int LangId {get;set;} 
    public string Text {get;set;} 
} 

所以我的觀點我使用:

@Html.EditorFor(model => model.Title.Text) 
@Html.ValidationMessageFor(model => model.Title.Text) 

有沒有一種方法,使驗證對於使用DataAnnotations的這些TextRef屬性?

我沒發現有什麼,所以我創建了一個自定義的驗證屬性:

public class TextRefRequiredAttribute : ValidationAttribute, IClientValidatable 
{ 
    public override bool IsValid(object value) 
    { 
     if (value is TextRef) 
      return !string.IsNullOrEmpty(((TextRef)value).Text); 
     else 
      return true; 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule(); 
     rule.ValidationType = "textref"; 
     yield return rule; 
    } 
} 

現在在服務器端驗證工作,但客戶端是沒有的。實際上並沒有爲他們的輸入產生「data-val-」屬性。

UPDATE:

我的客戶端腳本是:

public class CategoryValidator : AbstractValidator<CategoryViewModel> 
{ 
    public CategoryValidator() 
    { 
     RuleFor(o => o.Title.Text) 
      .NotEmpty(); 
    } 
} 

但還是沒有機會:

$.validator.addMethod("textref", function (value, element, param) { 
    return (value != ""); 
}); 

$.validator.unobtrusive.adapters.addBool("textref"); 

我也使用FluentValidation嘗試。

謝謝

回答

0

該屬性看起來對我好。您需要在客戶端註冊自定義適配器,但應該看起來有點像這樣。

<script type="text/javascript"> 
    $(function() { 
     jQuery.validator.unobtrusive.adapters.addBool('textref'); 
    }); 
</script> 

它們將出現上面

@Html.EditorFor(model => model.Title.Text) 
@Html.ValidationMessageFor(model => model.Title.Text) 
+0

謝謝,其實我已經註冊在首位的適配器。我發現如果我將EditorFor(model => model.Title.Text)更改爲TextBoxFor(model => o.model.Title),則會將「data-val-」屬性添加到輸入元素,並且客戶端驗證將進行正確,但這樣做會導致綁定問題和接收模式。標題將爲空 – sos00 2011-03-29 15:31:09

+0

您是否設法弄清楚如何解決此問題?我面臨完全相同的問題,但是使用DateTime類型,我無法自己裝飾Date和TimeOfDay屬性。 – 2012-05-01 04:50:36

相關問題