Использование атрибута метаданных описания в ASP.NET MVC - PullRequest
2 голосов
/ 13 сентября 2010

Я работаю над проектом VB.NET, в котором используется ASP.NET MVC 2. Я использую возможность добавлять валидацию и другие атрибуты к метаданным в моей модели.

Например, я добавил атрибуты, такие как <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

Но я должен признать, что часть «выражения» выходит далеко за пределы моей лямбды / LINQ / ?? знания на данном этапе !!

Заранее спасибо ...

Ответы [ 2 ]

4 голосов
/ 13 сентября 2010

Что ж, если вы используете MVC 3, вы можете использовать DisplayAttribute и просто использовать параметр Description следующим образом.

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 может не работать должным образом с аннотациями данных)

<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
3 голосов
/ 09 января 2013

Вот более полная версия, которую я написал для 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));
}

Используется так:

...