从HTML帮助器中的参数获取属性

时间:2011-11-14 16:22:34

标签: asp.net asp.net-mvc-3

所以,让我们说我有一个小模型对象,其中包含一个所需的字符串,最大长度为50:

public class ObjectModel
{
    [Required]
    [MaxLength(50)]
    public string Name { get; set; }
}

我需要创建一个自定义HTML帮助器,我可以传入一个字符串(在本例中为ObjectModel.Name),如果需要,创建一个带有类"必需&#34的HTML输入元素;。

现在,我正试图与之合作:

 public static HtmlString Input(string label)
 {
     return new HtmlString("<input type=\"text\" />");
 }

因此,在我的Razor视图中,如果我执行@InputHelper.Input(Model.Name)之类的操作,则无法访问这些属性。我的问题是,如何构建我的HTML帮助程序类以接受Model属性及其属性?

所以我取得了进一步的进展,但我仍然没有足够的经验来浏览表达式以获得我想要的东西。现在,我有:

@InputHelper.Input(m => Model.Title.TitleName, "titlename2", "Title Name")

第二个和第三个参数与此问题无关。在辅助方法中,我有:

public static HtmlString Input(Expression<Func<string, Object>> expression, string id, string label)

但是当我去调试代码时,有很多对象和属性需要筛选,我不知道我的Required和MaxLength属性在哪里,如果它们甚至在那里。

2 个答案:

答案 0 :(得分:2)

您可以使用以下扩展方法获取RequiredMaxLength属性:

public static class ExpressionExtensions
{
    public static TAttribute GetAttribute<TIn, TOut, TAttribute>(this Expression<Func<TIn, TOut>> expression) where TAttribute : Attribute
    {
        var memberExpression = expression.Body as MemberExpression;
        var attributes = memberExpression.Member.GetCustomAttributes(typeof(TAttribute), true);
        return attributes.Length > 0 ? attributes[0] as TAttribute : null;
    }
}

然后从你的代码中你可以做到:

public static HtmlString Input(Expression<Func<string, Object>> expression, string id, string label)
{
    var requiredAttribute = expression.GetAttribute<string, object, RequiredAttribute>();
    if (requiredAttribute != null) 
    {
        // some code here
    }
}

答案 1 :(得分:0)

你必须看看他们用.NET框架做了什么。创建一个采用Expression&gt;的方法,然后使用代码从帮助程序中提取属性的名称: