ASP.NET MVC: доступ к атрибутам ViewModel в представлении - PullRequest
4 голосов
/ 22 сентября 2011

Есть ли способ получить какие-либо атрибуты (будь то атрибуты аннотации данных, атрибуты проверки или пользовательские атрибуты) в свойствах ViewModel из представления?Одна из вещей, которую я хотел бы добавить небольшой обязательный индикатор рядом с полями, свойство которых имеет атрибут [Обязательный].

Например, если моя ViewModel выглядела так:

public class MyViewModel
{
    [Required]
    public int MyRequiredField { get; set; } 
}

Iхотел бы сделать что-то в шаблоне EditorFor, например, так:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<int?>" %>

<div class="label-container">
    <%: Html.Label("") %>

    <% if (PROPERTY_HAS_REQUIRED_ATTRIBUTE) { %>
        <span class="required">*</span>
    <% } %>
</div>
<div class="field-container">
    <%: Html.TextBox("") %>
    <%: Html.ValidationMessage("") %>
</div>

Ответы [ 2 ]

7 голосов
/ 22 сентября 2011

Информация, которую вы ищете, находится в ViewData.ModelMetadata. В серии постов Брэда Уилсона, посвященной шаблонам , должно быть объяснено все это, особенно статья ModelMetadata .

.

Что касается других атрибутов ValidationAttributes, вы можете получить к ним доступ с помощью метода ModelMetadata.GetValidators().

ModelMetadata.IsRequired скажет вам, если сложный тип (или тип значения, заключенный в Nullable<T>) требуется для RequiredAttribute, но он даст вам ложные срабатывания для типов значений, которые не могут быть обнуляемыми (потому что они неявно требуется). Вы можете обойти это с помощью следующего:

bool isReallyRequired = metadata.IsRequired 
    && (!metadata.ModelType.IsValueType || metadata.IsNullableValueType);

Примечание: вам нужно использовать !metadata.ModelType.IsValueType вместо model.IsComplexType, потому что ModelMetadata.IsComplexType возвращает false, поскольку MVC не считается сложным типом, включающим строки.

1 голос
/ 22 сентября 2011

Я бы предложил не делать этого, потому что вы добавляете логику в представление, что является плохой практикой.Почему бы вам не создать HtmlHelper или LabelExtension, вы можете вызвать ModelMetaProvider внутри метода и выяснить, имеет ли свойство оформленный атрибут Required?

...