Access displayName attribute from the model in MVC

2019-03-17 16:07发布

If my model have

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

Then I can print it in the View with LabelFor

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

It will then render as

<label for="firstName">First Name</label>
  • But how can I "raw" read the property (FirstName) attributes in the View? If for example, I want to send the value to a function on the View page

7条回答
Summer. ? 凉城
2楼-- · 2019-03-17 16:30

To access the attributes you'll need a custom Html helper. Since the attributes aren't really part of the property or model you need to go in a round about way to access them.

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

For additional attributes that aren't part of the DataAnnotations you can do the following:

Create a custom attribute

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;
    }
}

The magic happens in the OnMetadataCreated implementation. Here we can populate the AdditionalValues with anything we need for our particular Attribute. In this case we’re adding a Tooltip key. Your name should be unique as other attributes or providers may add their own keys with the same name It is important to remember that attributes are not always read in the same order. So your tooltip attribute may be called first, last or somewhere in the middle. This is an important distinction as it may cause undesired effects.

Then create a custom Attribute helper

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楼-- · 2019-03-17 16:35

@(This.Model.acc_first)

Should work

so in javascript you can use it like

function callme(val)
{
   //some ajax call with 
   @(This.Model.acc_first)
}
查看更多
Root(大扎)
4楼-- · 2019-03-17 16:41

you should simply use

[Display(Name = "First Name")]


 public string name{ get; set; }
查看更多
爱情/是我丢掉的垃圾
5楼-- · 2019-03-17 16:43
@Html.DisplayFor(model => model.acc_first)

should work for you. If not, try just

@Model.acc_first

Either one should work fine.

查看更多
够拽才男人
6楼-- · 2019-03-17 16:47
@Html.DisplayNameFor(x => x.acc_first)
查看更多
Lonely孤独者°
7楼-- · 2019-03-17 16:48

You can access the value of the attribute Display(Name="...") in 4 steps:

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;

Then displayname will have the value First Name in your context.

查看更多
登录 后发表回答