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

Доступ к атрибуту displayName из модели в MVC View

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

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

Затем я могу напечатать его в представлении с LabelFor

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

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

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

Ответ 1

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

Ответ 2

Чтобы получить доступ к атрибутам, вам понадобится специальный 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. Здесь мы можем заполнить дополнительныеValues ​​всем необходимым для нашего конкретного атрибута. В этом случае добавлялся ключ всплывающей подсказки. Ваше имя должно быть уникальным, поскольку другие атрибуты или поставщики могут добавлять свои собственные ключи с тем же именем. Важно помнить, что атрибуты не всегда читаются в том же порядке. Таким образом, ваш атрибут tooltip можно назвать первым, последним или где-то посередине. Это важное различие, поскольку оно может вызвать нежелательные эффекты.

Затем создайте настраиваемый вспомогательный атрибут

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("");
}

Ответ 3

Вы можете получить доступ к значению атрибута 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 в вашем контексте.

Ответ 5

вам следует просто использовать

[Display(Name = "First Name")]


 public string name{ get; set; }

Ответ 6

<label asp-for="firstName">First Name</label>

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

Ответ 7

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

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

@Model.acc_first

Либо один должен работать нормально.

Ответ 8

@(This.Model.acc_first)

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

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

function callme(val)
{
   //some ajax call with 
   @(This.Model.acc_first)
}