Доступ к атрибуту displayName из модели в MVC View - PullRequest
29 голосов
/ 14 сентября 2011

Если у моей модели

[DisplayName("First Name")]
public string firstName { get; set; }

Тогда я могу распечатать его в виде с помощью LabelFor

@Html.LabelFor(model => model.acc_first)

Затем будет отображаться как

<label for="firstName">First Name</label>
  • Но как я могу "raw" прочитать атрибуты свойства (FirstName) в View? Если, например, я хочу отправить значение функции на странице просмотра

Ответы [ 8 ]

44 голосов
/ 13 декабря 2012
@Html.DisplayNameFor(x => x.acc_first)
13 голосов
/ 14 сентября 2011

Для доступа к атрибутам вам понадобится пользовательский помощник Html. Поскольку атрибуты на самом деле не являются частью свойства или модели, вам нужно обойти их.

public static IHtmlString DisplayName<TModel, TValue>(
                             this HtmlHelper<TModel> html,
                             Expression<Func<TModel, TValue>> expression) {
    var metadata = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);

    return new HtmlString(metadata.DisplayName);
}

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

Создать пользовательский атрибут

public class TooltipAttribute : Attribute, IMetadataAware {
    public TooltipAttribute(string tooltip) {
        this.Tooltip = tooltip;
    }

    public string Tooltip { get; set; }

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

Волшебство происходит в реализации OnMetadataCreated. Здесь мы можем заполнить AdditionalValues ​​всем, что нам нужно для нашего конкретного атрибута. В этом случае мы добавляем ключ всплывающей подсказки. Ваше имя должно быть уникальным, так как другие атрибуты или поставщики могут добавлять свои собственные ключи с тем же именем. Важно помнить, что атрибуты не всегда читаются в одном и том же порядке. Таким образом, ваш атрибут всплывающей подсказки может называться первым, последним или где-то посередине. Это важное различие, поскольку оно может вызвать нежелательные эффекты.

Затем создайте пользовательский помощник Атрибута

public static IHtmlString TooltipFor<TModel, TValue>(
                             this HtmlHelper<TModel> html,
                             Expression<Func<TModel, TValue>> expression) {
    var metadata = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);
    if (metadata.AdditionalValues.ContainsKey("Tooltip"))
        return new HtmlString((string)metadata.AdditionalValues["Tooltip"]);

    return new HtmlString("");
}
6 голосов
/ 27 ноября 2015

Вы можете получить доступ к значению атрибута Display(Name="...") в 4 этапа:

var type = typeof(YourNamespace.Models.YourModelName);
var memInfo = type.GetMember("firstName"); // your member
var attributes = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), false);
var displayname = ((System.ComponentModel.DataAnnotations.DisplayAttribute)attributes[0]).Name;

Тогда displayname будет иметь значение First Name в вашем контексте.

3 голосов
/ 25 июля 2017

Опираясь на ответ Даррена Остера:

@Html.DisplayNameFor(x => x.acc_first)

Вот ссылка на документацию для этого: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.displaynameextensions.displaynamefor(v=vs.118).aspx

Вы можете использовать это в вашем коде вида, как это:

@{ 
    var foo = Html.DisplayNameFor(x => x.acc_first);

    // call function
    DoStuff(foo);
}
0 голосов
/ 20 мая 2019
<label asp-for="firstName">First Name</label>

вы должны перейти на asp-for

0 голосов
/ 25 января 2017

Вы должны просто использовать

[Display(Name = "First Name")]


 public string name{ get; set; }
0 голосов
/ 14 сентября 2011
@Html.DisplayFor(model => model.acc_first)

должно работать на вас.Если нет, попробуйте просто

@Model.acc_first

Любой из них должен работать нормально.

0 голосов
/ 14 сентября 2011

@(This.Model.acc_first)

Должно работать

, поэтому в javascript вы можете использовать его как

function callme(val)
{
   //some ajax call with 
   @(This.Model.acc_first)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...