Chr*_*ris 11 asp.net-mvc modelmetadata data-annotations
说我有这样的模特
public class User
{
    [Required]
    [StringLength(14, ErrorMessage = "Can only be 14 characters long")]
    public string UserName;
}
我想创建一个这样的Html帮助器:
@Html.ValidatableEditorFor(m => m.UserName)
这样它就会向jQuery Vaidation插件发出一个正确格式的文本字段,以便能够验证,如下所示:
   <input type="text" class="required" maxlength="14" />
根据我的研究,似乎没有办法迭代MetaDataModel中的所有数据注释,以便我可以检查哪一个适用于jQuery验证.
我如何设想它在伪代码中工作:
    var tag = new TagBuilder("input");
    tag.mergeAttribute("type", "text");
    foreach(var attribute in metadata.attributes)
    {
       CheckForValidatableAttribute(attribute, tag);
    }
...
    private void CheckForValidatableAttribute(DataAnnotation attribute, TagBuilder tag)
    {
        switch(attribute.type)
       {
          case Required:
             tag.addClass("required");
             break;
          case StringLength
             tag.mergeAttribute("maxlength", attribute.value)
             break;
       }
    }
我怎么能去实现这样的帮助呢?我希望它能够处理数据注释,这样我就不必复制验证文字了.
例如,像TextEditorFor这样的当前Html帮助程序会将可验证的属性附加到其输出字段.它是如何做到的,我如何实现自己的实现?
干杯
你可以使用这个简单的条件:
if(attribute.Type is ValidationAttribute)
{
   string className = attribute.Type.Name.Replace("Attribute", "").ToLower();
}
定义一个Html帮助器:
public static MvcHtmlString ValidationEditorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, 
        Expression<Func<TModel, TProperty>> expression)
{
    ....
}
创建这个帮助方法:
private static string GetPropertyNameFromExpression<TModel, TProperty>(HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
    MemberExpression memberExpression = expression.Body as MemberExpression;
    if (memberExpression == null)
        throw new InvalidOperationException("Not a memberExpression");
    if (!(memberExpression.Member is PropertyInfo))
        throw new InvalidOperationException("Not a property");
    return memberExpression.Member.Name;
}
现在用于ValidationEditorFor:
var propertyName = GetPropertyNameFromExpression(htmlHelper, expression);
var propertyType = typeof(TModel).GetProperties().Where(x=>x.Name == propertyName).First().PropertyType;
var attributes = propertyType.GetCustomAttributes(true).OfType<ValidationAttribute>();
现在你可以检查属性......休息很简单.
| 归档时间: | 
 | 
| 查看次数: | 2856 次 | 
| 最近记录: |