使用ASP.NET MVC中的描述元数据属性

时间:2010-09-13 17:19:04

标签: asp.net-mvc model metadata html-helper

我正在开发一个使用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 / ??现阶段的知识!!

提前致谢...

2 个答案:

答案 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

MVC2

我刚刚进行粗略测试,看看是否有效。 (我不经常使用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" })