从 Lambda 属性表达式获取自定义属性
我正在使用 ASP.NET MVC 2 Preview 2 并编写了一个自定义 HtmlHelper 扩展方法来使用表达式创建标签。 TModel 来自具有属性的简单类,并且属性可能具有定义验证要求的属性。我试图找出表达式在我的标签方法中表示的属性上是否存在某个属性。
类和标签的代码是:
public class MyViewModel
{
[Required]
public string MyProperty { get; set; }
}
public static MvcHtmlString Label<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string label)
{
return MvcHtmlString.Create(string.Concat("<label for=\"", expression.GetInputName(), "\">", label, "</label>"));
}
public static string GetInputName<TModel, TProperty>(this Expression<Func<TModel, TProperty>> expression)
{
return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1);
}
那么我会这样调用标签:
Html.Label(x => x.MyProperty, "My Label")
有没有办法查明传递给 Label 方法的表达式值中的属性是否具有必需属性?
我发现执行以下操作确实可以获取该属性(如果存在),但我希望有一种更简洁的方法来实现此目的。
public static MvcHtmlString Label<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string label)
{
System.Attribute.GetCustomAttribute(Expression.Property(Expression.Parameter(expression.Parameters[0].Type, expression.GetInputName()), expression.GetInputName()).Member, typeof(RequiredAttribute))
return MvcHtmlString.Create(string.Concat("<label for=\"", expression.GetInputName(), "\">", label, "</label>"));
}
I am using ASP.NET MVC 2 Preview 2 and have written a custom HtmlHelper extension method to create a label using an expression. The TModel is from a simple class with properties and the properties may have attributes to define validation requirements. I am trying to find out if a certain attribute exists on the property the expression represents in my label method.
The code for the class and label is:
public class MyViewModel
{
[Required]
public string MyProperty { get; set; }
}
public static MvcHtmlString Label<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string label)
{
return MvcHtmlString.Create(string.Concat("<label for=\"", expression.GetInputName(), "\">", label, "</label>"));
}
public static string GetInputName<TModel, TProperty>(this Expression<Func<TModel, TProperty>> expression)
{
return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1);
}
Then I would call the label like this:
Html.Label(x => x.MyProperty, "My Label")
Is there a way to find out if the property in the expression value passed to the Label method has the Required attribute?
I figured out that doing the following does get me the attribute if it exists, but I am hopeful there is a cleaner way to accomplish this.
public static MvcHtmlString Label<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string label)
{
System.Attribute.GetCustomAttribute(Expression.Property(Expression.Parameter(expression.Parameters[0].Type, expression.GetInputName()), expression.GetInputName()).Member, typeof(RequiredAttribute))
return MvcHtmlString.Create(string.Concat("<label for=\"", expression.GetInputName(), "\">", label, "</label>"));
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您的表达式解析逻辑可能需要一些工作。您不是处理实际类型,而是转换为字符串。
您可以使用以下一组扩展方法。第一个获取成员的姓名。第二个/第三个结合起来检查该属性是否在成员上。 GetAttribute 将返回请求的属性或 null,而 IsRequired 仅检查该特定属性。
希望这对您有所帮助。
Your expression parsing logic could use some work. Rather than deal with the actual types, you are converting to strings.
Here is a set of extension methods that you might use instead. The first gets the name of the member. The second/third combine to check if the attribute is on the member. GetAttribute will return the requested attribute or null, and the IsRequired just checks for that specific attribute.
Hopefully this helps you out.
这段代码怎么样(来自 codeplex 上的 MVC 项目)
How about this code (from the MVC project on codeplex)