Подтвердить что ты не робот

Доступ к атрибутам из Custom Html Helpers в asp.net mvc 4 бритвы

Я создал HtmlHelper в asp.net mvc 4 механизма просмотра бритвы С#.

Можно ли передать свойство модели представления в мой класс-помощник?

Например, у меня есть свойство

[Required]
[Display(Name = "Your Lastname")]
public string Lastname { get; set; }

Могу ли я передать это свойство моему помощнику, что-то вроде этого @Html.Example(model = > model.Lastname), а не получать данные в помощнике (если это поле требуется, то, что является отображаемым именем и т.д.)?

Спасибо

4b9b3361

Ответ 1

Атрибут [Display] обогащает метаданные. Таким образом, вы можете получить информацию из метаданных.

Например, если вы хотите получить отображаемое имя внутри помощника:

public static class HtmlHelpers
{
    public static IHtmlString Example<TModel, TProperty>(
        this HtmlHelper<TModel> html, 
        Expression<Func<TModel, TProperty>> ex
    )
    {
        var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData);
        var displayName = metadata.DisplayName;
        return new HtmlString(html.Encode(displayName));
    }
}

а затем, если мы предположим, что у вас есть модель вида:

public class MyViewModel
{
    [Required]
    [Display(Name = "Your Lastname")]
    public string Lastname { get; set; }
}

вы можете использовать помощника в своем строго типизированном виде:

@model MyViewModel

@Html.Example(x => x.Lastname)

Теперь предположим, что вы написали собственный атрибут метаданных:

public class FooBarAttribute : Attribute, IMetadataAware
{
    public FooBarAttribute(string bar)
    {
        Bar = bar;
    }
    public string Bar { get; private set; }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues["foo"] = Bar;
    }
}

который вы использовали для украшения своей модели:

public class MyViewModel
{
    [Required]
    [FooBar("This is the bar")]
    public string SomeBar { get; set; }
}

а затем внутри вашего помощника вы можете получить настраиваемый атрибут:

public static class HtmlHelpers
{
    public static IHtmlString Example<TModel, TProperty>(
        this HtmlHelper<TModel> html, 
        Expression<Func<TModel, TProperty>> ex
    )
    {
        var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData);
        if (metadata.AdditionalValues.ContainsKey("foo"))
        {
            var foo = metadata.AdditionalValues["foo"] as string;
            return new HtmlString(html.Encode(foo));
        }
        return MvcHtmlString.Empty;
    }
}

UPDATE:

Кажется, вам нужно получить сообщение Required. Не знаю, почему вам нужно сделать это в пользовательском помощнике, но вот пример того, как вы могли бы добиться этого:

public static class HtmlHelpers
{
    public static IHtmlString Example<TModel, TProperty>(
        this HtmlHelper<TModel> html, 
        Expression<Func<TModel, TProperty>> ex
    )
    {
        var me = (ex.Body as MemberExpression);
        if (me != null)
        {
            var required = me
                .Member
                .GetCustomAttributes(typeof(RequiredAttribute), false)
                .Cast<RequiredAttribute>()
                .FirstOrDefault();
            if (required != null)
            {
                var msg = required.FormatErrorMessage(me.Member.Name);
                return new HtmlString(html.Encode(msg));
            }
        }
        return MvcHtmlString.Empty;
    }
}