C# MVC自定义模型属性转换为HTML属性

C# MVC自定义模型属性转换为HTML属性,c#,model-view-controller,attributes,adapter,C#,Model View Controller,Attributes,Adapter,我目前(据我所知)滥用ValidateAttribute来获取生成HTML视图时显示的模型属性 我有一个模型属性,带有一个自定义属性(支持一些客户端Json处理): 它在视图中的使用方式如下: @Html.TextBoxFor(m => m.City, new { @class = "A", tabindex = 10, title = "B" }) 其结果是: <input class="A" data-val="true" data-val-pair="" data-val-p

我目前(据我所知)滥用ValidateAttribute来获取生成HTML视图时显示的模型属性

我有一个模型属性,带有一个自定义属性(支持一些客户端Json处理):

它在视图中的使用方式如下:

@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=""/>
我当前的适配器实现:

[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};
    }
}
//谢谢:http://stackoverflow.com/questions/4120792/how-can-i-have-a-custom-validationattribute-rendered-as-a-data-val-xx-attribut
公共类JsonResultPairAdapter:DataAnnotationsModelValidator
{
private const String Pair=“Pair”;
private const String PairSource=“src”;
私有常量字符串PairField=“fld”;
公共JsonResultPairAdapter(ModelMetadata元数据、ControllerContext上下文、JsonResultPair属性):基(元数据、上下文、属性)
{
}
公共重写IEnumerable GetClientValidationRules()
{
ModelClientValidationRule=新的ModelClientValidationRule
{
ErrorMessage=ErrorMessage,
ValidationType=Pair
};
添加(PairSource,Attribute.Source);
rule.ValidationParameters.Add(PairField,Attribute.Field);
返回新的[]{rule};
}
}

我认为这个博客为你的问题提供了一个非常好/详细的答案:

基本步骤包括:

  • 创建自定义属性(您已经这样做了),不要从验证属性继承
  • 基于数据注释提供程序创建元数据提供程序,该提供程序还将读取/添加您的属性到模型的元数据中
  • 为文本框创建模板,或在视图本身的查询Model.Metadata中创建模板,以获取您正在使用的自定义属性及其值

  • 我认为这个博客为你的问题提供了一个非常好/详细的答案:

    基本步骤包括:

  • 创建自定义属性(您已经这样做了),不要从验证属性继承
  • 基于数据注释提供程序创建元数据提供程序,该提供程序还将读取/添加您的属性到模型的元数据中
  • 为文本框创建模板,或在视图本身的查询Model.Metadata中创建模板,以获取您正在使用的自定义属性及其值
  • // 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};
        }
    }