Определите разметку для полей [Обязательный] в представлении в ASP.NET MVC 2.0 - PullRequest
3 голосов
/ 04 июня 2010

У нас есть модель со свойствами, помеченными [Обязательно], которая отлично подходит для проверки. Однако мы хотели бы пометить эти обязательные поля в представлении звездочкой (или другим стилем), чтобы обозначить, что они обязательны для заполнения, прежде чем пользователь введет какие-либо данные для проверки.

Кажется, я не могу найти что-то встроенное в инфраструктуру MVC, чтобы позволить мне сделать это, и поэтому задавался вопросом, кто-нибудь еще уже решил это и как?

В конечном итоге мы пытаемся предотвратить необходимость изменения кода в двух местах, если впоследствии мы удалим [Обязательный] из свойства модели.

Большое спасибо

Ответы [ 5 ]

4 голосов
/ 04 июня 2010

Вы можете создать собственное расширение HtmlHelper для этого:

public static string RequiredMarkFor<TModel, TValue>(this HtmlHelper html, Expression<Func<TModel, TValue>> expression)
{
    if(ModelMetadata.FromLambdaExpression(expression, html.ViewData).IsRequired)
         return "*";
    else
         return string.Empty;
}
3 голосов
/ 08 февраля 2012

Проблема с решением от Грегуара и Факсанаду состоит в том, что всегда отображается «*», также когда поле проверяется с использованием обычной проверки, и вы используете Html.ValidationMessageFor ().

Так что, если вы используете расширение html следующим образом:

@Html.EditorFor(model => model.Email)
@Html.RequiredFieldFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)

Вы увидите дубликат * в случае, если в поле есть ошибки проверки.


Я сделал это модифицированное расширение на основе этого , которое также проверяет, было ли проверено поле.

private static Type[] RequiredTypes = new Type[] { typeof(CustomRequiredAttribute), typeof(RequiredAttribute) };

/// <summary>
/// Generate a &lt;span class="field-validation-error"&gt;*&lt;&lt; element.
/// 
/// See http://koenluyten.blogspot.com/2011/06/denote-required-fields-in-aspnet-mvc-3.html
/// </summary>
public static MvcHtmlString RequiredFieldFor<TModel, TValue>(this HtmlHelper<TModel> html,
    Expression<Func<TModel, TValue>> expression, string validationMessage = "*")
{
    // Get the metadata for the model
    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);

    string fieldName = metadata.PropertyName;

    // Check if the field is required
    bool isRequired = metadata
        .ContainerType.GetProperty(fieldName)
        .GetCustomAttributes(false)
        .Count(m => RequiredTypes.Contains(m.GetType())) > 0;

    // Check if the field is validated
    bool isValidated = html.ViewData.ModelState[fieldName] != null;

    // If the field is required and not validated; generate span with an asterix
    if (isRequired && !isValidated)
    {
        var span = new TagBuilder("span");
        span.AddCssClass("field-validation-error");
        span.SetInnerText(validationMessage);

        return MvcHtmlString.Create(span.ToString(TagRenderMode.Normal));
    }

    return null;
}
2 голосов
/ 07 октября 2010

Если вы получаете ошибку «Недопустимые аргументы» при использовании «ModelMetadata.FromLambdaExpression», убедитесь, что вы указали параметр универсального типа для HtmlHelper. Вот пересмотренная версия решения Грегуара:

public static string RequiredMarkFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        if (ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).IsRequired)
            return "*";
        else
            return string.Empty;
    }
1 голос
/ 04 июня 2010

Если вы используете шаблонные помощники полной формы EditorFor и DisplayFor, вам нужно настроить собственную версию Object.ascx.

У Брэда Уилсона есть потрясающая запись в блоге, в которой об этом говорится:

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html

Что произойдет, свойство IsRequired в ModelMetadata будет истинным. Внутри Object.ascx:

<%=propertu.IsRequired ? "*" : ""%>

Если вы не используете шаблонных помощников, вам придется написать свой собственный помощник html. Как выглядят ваши взгляды?

0 голосов
/ 27 июня 2012

У меня сейчас вопрос немного старый, но я работаю над ненавязчивым решением, используя только jquery.

Моя цель состоит в том, чтобы все входные данные были помечены атрибутом data-val-required, а затем установить его метки.

Вот пример кода jquery:

$('[data-val-required]').each(function() { 
    var $label = $('label[for=' + this.name + ']');

    //from here we can manipulate the label element
    $label.css('font-weight', 'bold');
    $label.text($label.text() + ' *');
});
...