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

时间:2011-09-14 15:10:28

标签: asp.net asp.net-mvc-3 razor

如果我的模特有

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

然后我可以在带有LabelFor的视图中打印它

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

然后呈现为

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

9 个答案:

答案 0 :(得分:44)

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

答案 1 :(得分: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);
}

对于不属于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。在这种情况下,我们添加了一个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("");
}

答案 2 :(得分:5)

您可以通过4个步骤访问属性Display(Name="...")的值:

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 :(得分:3)

以Darren Oster的回答为基础:

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

答案 4 :(得分:0)

你应该只使用

[Display(Name = "First Name")]


 public string name{ get; set; }

答案 5 :(得分:0)

  File "<ipython-input-129-a0ad4118e99e>", line 1, in <module>
    pruned_model.fit(x1,y, epochs=50, verbose=True, batch_size=16,callbacks=callbacks)

  File "C:\Users\Rubens\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py", line 806, in fit
    shuffle=shuffle)

  File "C:\Users\Rubens\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py", line 2503, in _standardize_user_data
    self._set_inputs(cast_inputs)

  File "C:\Users\Rubens\Anaconda3\lib\site-packages\tensorflow\python\training\tracking\base.py", line 456, in _method_wrapper
    result = method(self, *args, **kwargs)

  File "C:\Users\Rubens\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\training.py", line 2773, in _set_inputs
    outputs = self.call(inputs, training=training)

  File "C:\Users\Rubens\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\sequential.py", line 256, in call
    outputs = layer(inputs, **kwargs)

  File "C:\Users\Rubens\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 594, in __call__
    self._maybe_build(inputs)

  File "C:\Users\Rubens\Anaconda3\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 1713, in _maybe_build
    self.build(input_shapes)

  File "C:\Users\Rubens\Anaconda3\lib\site-packages\tensorflow_model_optimization\python\core\sparsity\keras\pruning_wrapper.py", line 175, in build
    self.prunable_weights = self.layer.get_prunable_weights()

  File "C:\Users\Rubens\Anaconda3\lib\site-packages\tensorflow_model_optimization\python\core\sparsity\keras\prune_registry.py", line 169, in get_prunable_weights
    return [getattr(layer, weight) for weight in cls._weight_names(layer)]

  File "C:\Users\Rubens\Anaconda3\lib\site-packages\tensorflow_model_optimization\python\core\sparsity\keras\prune_registry.py", line 169, in <listcomp>
    return [getattr(layer, weight) for weight in cls._weight_names(layer)]

AttributeError: 'Dense' object has no attribute 'kernel'

您必须更改为asp-for

答案 6 :(得分:0)

[Display(Name ="First Name")]

答案 7 :(得分:-2)

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

应该适合你。如果没有,请尝试

@Model.acc_first

任何一个都应该可以正常工作。

答案 8 :(得分:-3)

@(This.Model.acc_first)

应该工作

所以在javascript中你可以像

一样使用它
function callme(val)
{
   //some ajax call with 
   @(This.Model.acc_first)
}