所以,让我们说我有一个小模型对象,其中包含一个所需的字符串,最大长度为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属性在哪里,如果它们甚至在那里。
答案 0 :(得分:2)
您可以使用以下扩展方法获取Required
和MaxLength
属性:
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;的方法,然后使用代码从帮助程序中提取属性的名称: