从MVC视图中的模型访问displayName属性

Joa*_*kim 31 asp.net razor asp.net-mvc-3

如果我的模特有

[DisplayName("First Name")]
public string firstName { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后我可以在View with LabelFor中打印它

@Html.LabelFor(model => model.acc_first)
Run Code Online (Sandbox Code Playgroud)

它将呈现为

<label for="firstName">First Name</label>
Run Code Online (Sandbox Code Playgroud)
  • 但是我如何"原始"读取视图中的属性(FirstName)属性?例如,我想将值发送到View页面上的函数

Dar*_*ter 46

@Html.DisplayNameFor(x => x.acc_first)
Run Code Online (Sandbox Code Playgroud)


Bui*_*ted 13

要访问属性,您需要一个自定义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);
}
Run Code Online (Sandbox Code Playgroud)

对于不属于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;
    }
}
Run Code Online (Sandbox Code Playgroud)

神奇的事情发生在OnMetadataCreated实现中.在这里,我们可以使用我们特定属性所需的任何东西填充AdditionalValues.在这种情况下,我们添加了一个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("");
}
Run Code Online (Sandbox Code Playgroud)


out*_*ind 6

您可以通过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;
Run Code Online (Sandbox Code Playgroud)

然后displaynameFirst Name在您的上下文中具有值.


bvp*_*vpb 5

基于 Darren Oster 的回答:

@Html.DisplayNameFor(x => x.acc_first)
Run Code Online (Sandbox Code Playgroud)

这是指向此文档的链接: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);
}
Run Code Online (Sandbox Code Playgroud)


Nik*_*hep -4

@(This.Model.acc_first)

应该管用

所以在javascript中你可以像这样使用它

function callme(val)
{
   //some ajax call with 
   @(This.Model.acc_first)
}
Run Code Online (Sandbox Code Playgroud)