如何在mvc3中更改剃刀中LabelFor的显示名称?

时间:2012-07-25 13:49:40

标签: asp.net-mvc-3 html-helper

在razor引擎中,我使用LabelFor辅助方法显示名称

但显示名称似乎不好显示。 所以我需要更改我的显示名称怎么做....

@Html.LabelFor(model => model.SomekingStatus, new { @class = "control-label"}) 

5 个答案:

答案 0 :(得分:152)

您可以使用[DisplayName]属性修饰视图模型属性,并指定要使用的文本:

[DisplayName("foo bar")]
public string SomekingStatus { get; set; }

或者使用LabelFor帮助器的另一个重载,它允许您指定文本:

@Html.LabelFor(model => model.SomekingStatus, "foo bar")

而且,不,你不能像你想要的那样在MVC3中指定一个类名,因为LabelFor帮助器不支持它。但是,这可以在MVC4或5中使用。

答案 1 :(得分:28)

这是一个老问题,但现有的答案忽略了重新生成模型时丢弃任何自定义属性的严重问题。我正在添加更详细的答案,以涵盖当前可用的选项。

您有3个选项:

  • [DisplayName("Name goes here")]属性添加到数据模型类。缺点是,无论何时重新生成数据模型,都会丢弃它。
  • 将字符串参数添加到Html.LabelFor。例如@Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})参考:https://msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelfor(v=vs.118).aspx这样做的缺点是你必须在每个视图中重复标签。
  • 第三种选择。使用附加到数据类的元数据类(详细信息如下)。

选项3 - 添加元数据类:

Microsoft允许在Entity Framework类上装饰属性,而不修改现有类!这是通过附加到数据库类的元数据类(实际上是EF类的横向扩展)。这允许将属性添加到关联的类而不是类本身,以便在重新生成数据模型时不会丢失更改

例如,如果您的数据类为MyModel且属性为SomekingStatus,则可以这样执行:

首先声明一个同名的部分类(并使用相同的命名空间),这允许您添加一个类属性而不被覆盖:

[MetadataType(typeof(MyModelMetaData))]
public partial class MyModel
{
}

所有生成的数据模型类都是部分类,它允许您通过简单地创建更多相同名称的类来添加额外的属性和方法(这非常方便,我经常使用它,例如提供其他字段类型的格式化字符串版本在模型中)。

步骤2:添加新分部类引用的元数据类:

public class MyModelMetaData
{
    // Apply DisplayNameAttribute (or any other attributes)
    [DisplayName("My New Label")]
    public string SomekingStatus;
}

参考: https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute(v=vs.110).aspx

说明:

  • 从内存中,如果您开始使用元数据类,它可能会忽略实际类([required]等)上的现有属性,因此您可能需要在元数据类中复制这些属性。
  • 这不是魔法操作,不会只适用于任何类。查找UI装饰属性的代码旨在首先查找元数据类。

答案 2 :(得分:14)

您可以使用DisplayName属性装饰属性来更改标签的文字。

[DisplayName("Someking Status")]
public string SomekingStatus { get; set; }

或者,您可以明确地编写原始HTML:

<label for="SomekingStatus" class="control-label">Someking Status</label>

答案 3 :(得分:3)

使用DisplayName属性装饰model属性。

答案 4 :(得分:0)

@ Html.LabelFor(model =&gt; model.SomekingStatus,&#34; foo bar&#34;)