asp.net-mvc – 可以浏览DataAnnotations的自定义Html帮助器

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 可以浏览DataAnnotations的自定义Html帮助器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
说我有这样的模型
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();
}

UPDATE

定义一个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,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;
}

现在在ValidationEditor中使用这个:

var propertyName = GetPropertyNameFromExpression(htmlHelper,expression);
var propertyType = typeof(TModel).GetProperties().Where(x=>x.Name == propertyName).First().PropertyType;
var attributes = propertyType.GetCustomAttributes(true).OfType<ValidationAttribute>();

现在你可以检查属性….休息很容易.

猜你在找的asp.Net相关文章