我正在开发一个使用ASP.NET MVC 2的VB.NET项目。我正在利用将验证和其他属性添加到模型中的元数据的能力。
例如,我已将<DisplayName("Full Name")>
等属性添加到模型中的属性,并使用Html.LabelFor ()
扩展方法渲染这些属性。
我还在模型中的各种属性中添加了<Description ("This is a description of the field.")>
属性,并希望以类似的方式呈现这些属性。
我的问题是 - 是否存在可以为我执行此操作的扩展方法?
如果没有,有人可以引导我朝正确的方向写我自己的方向吗?我已经根据现有方法的方法签名启动了一个...
<ExtensionAttribute()> _
Public Function HintFor(Of TModel, TProperty) _
(ByVal htmlHelper As HtmlHelper(Of TModel), _
ByVal expression As Expression(Of Func(Of TModel, TProperty))) As MvcHtmlString
End Function
但我必须承认,'表达'部分远远超出我的Lambda / LINQ / ??现阶段的知识!!
提前致谢...
答案 0 :(得分:4)
好吧,如果你正在使用MVC 3,你可以使用DisplayAttribute
,只需使用描述参数。
Public Class User
<Display(Name = "User name", Description = "This is a description")> _
Public Property Name As String
End Class
<System.Runtime.CompilerServices.Extension> _
Public Shared Function HintFor(Of TModel, TValue)(html As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TValue))) As IHtmlString
Dim attribute = ModelMetadata.FromLambdaExpression(Of TModel, TValue)(expression, html.ViewData)
Return MvcHtmlString.Create(attribute.Description)
End Function
我刚刚进行粗略测试,看看是否有效。 (我不经常使用VB并使用在线转换器)没有错误捕获或任何东西,但它会产生你期望的结果。
<System.Runtime.CompilerServices.Extension()> _
Public Shared Function HintFor(Of TModel, TValue)(html As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TValue))) As IHtmlString
Dim ex As MemberExpression = DirectCast(expression.Body, MemberExpression)
For Each attribute As Attribute In ex.Expression.Type.GetProperty(ex.Member.Name).GetCustomAttributes(True)
If GetType(System.ComponentModel.DescriptionAttribute) = attribute.[GetType]() Then
Return MvcHtmlString.Create(DirectCast(attribute, System.ComponentModel.DescriptionAttribute).Description)
End If
Next
Dim x = ModelMetadata.FromLambdaExpression(Of TModel, TValue)(expression, html.ViewData)
Return MvcHtmlString.Create(x.Description)
End Function
我真的不确定为什么我这样做才能做到这一点。 (虽然我认为MVC 2可能无法正常使用DataAnnotations)
<System.Runtime.CompilerServices.Extension()> _
Public Shared Function HintFor(Of TModel, TValue)(html As HtmlHelper(Of TModel), expression As Expression(Of Func(Of TModel, TValue))) As IHtmlString
Dim x = ModelMetadata.FromLambdaExpression(Of TModel, TValue)(expression, html.ViewData)
Return MvcHtmlString.Create(x.Description)
End Function
答案 1 :(得分:3)
这是我为C#编写的更完整的版本,它也支持htmlAttributes:
public static MvcHtmlString DescriptionFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var description = metadata.Description;
RouteValueDictionary anonymousObjectToHtmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
TagBuilder tagBuilder = new TagBuilder("span");
tagBuilder.MergeAttributes<string, object>(anonymousObjectToHtmlAttributes);
tagBuilder.SetInnerText(description);
return new MvcHtmlString(tagBuilder.ToString(TagRenderMode.Normal));
}
像这样使用:
[Display(Name = "Style", Description = "Some description of this field")]
public float Style { get; set; }
@Html.DescriptionFor(model => model.Style, new { @class = "help-inline" })