2011-11-23 86 views
1

我目前正在滥用(据我所知)一个ValidateAttribute获取生成HTML视图时显示的模型属性。MVC自定义模型属性为HTML属性

我有一个模型属性,具有自定义属性(使一些客户方JSON处理):这是在视图中使用这样的

[JsonResultPair("Zipcode","City")] 
public virtual string City { get; set; } 

@Html.TextBoxFor(m => m.City, new { @class = "A", tabindex = 10, title = "B" }) 

导致:

<input class="A" data-val="true" data-val-pair="" data-val-pair-fld="City" data-val-pair-src="Zipcode" id="City" name="City" tabindex="10" title="B" type="text" value=""/> 

但理想情况下,我想省略data-val-pair =“”属性,通常用于保存错误消息,因为这不是实际的验证。我想使用数据值(或数据后的任何自定义名称)而不是data-val。任何想法如何做到这一点?

我当前属性的实现:

[AttributeUsage(AttributeTargets.Property)] 
public class JsonResultPair: ValidationAttribute 
{ 
    private readonly String _source; 
    private readonly String _field; 

    public JsonResultPair(String source, String field) 
    { 
     _source = source; 
     _field = field; 
    } 

    public String Source { get { return _source; } } 
    public String Field { get { return _field; } } 
} 

我目前适配器实现:

// thanks: http://stackoverflow.com/questions/4120792/how-can-i-have-a-custom-validationattribute-rendered-as-a-data-val-xx-attribut 
public class JsonResultPairAdapter : DataAnnotationsModelValidator<JsonResultPair> 
{ 
    private const String Pair = "pair"; 
    private const String PairSource = "src"; 
    private const String PairField = "fld"; 

    public JsonResultPairAdapter(ModelMetadata metadata, ControllerContext context, JsonResultPair attribute) : base(metadata, context, attribute) 
    { 
    } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
     ModelClientValidationRule rule = new ModelClientValidationRule 
     { 
      ErrorMessage = ErrorMessage, 
      ValidationType = Pair 
     }; 

     rule.ValidationParameters.Add(PairSource, Attribute.Source); 
     rule.ValidationParameters.Add(PairField, Attribute.Field); 

     return new []{ rule}; 
    } 
} 

回答

1

我觉得这个博客包含了你的问题非常好/详细的解答: add html attributes

基本步骤如下:

  1. 创建一个自定义属性(你已经做了),没有从验证继承属性
  2. 创建元数据提供商,基于数据的注释供应商,这也将读/添加属性模型的元数据
  3. 要么为文本框创建模板,要么在视图本身内创建查询Model.Metadata,以获取您正在使用的自定义属性及其值。