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


87

在剃须刀引擎中,我使用了LabelFor辅助方法来显示名称

但是显示名称似乎不好显示。所以我需要更改显示名称的方式...

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

这是一个非常老的问题,但与当前的MVC编码仍然非常相关。到目前为止,提供的两种解决方案都存在问题,因此,我添加了更详细的答案,涵盖了所有可用的3个选项。
Gone Coding

Answers:


160

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

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

或使用LabelFor帮助程序的另一个重载,该重载允许您指定文本:

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

而且,不,您不能像尝试那样在MVC3中指定类名,因为LabelFor帮助程序不支持该类名。但是,这将在MVC4或5中起作用。


@ raj2sekar1,如果是工作,这个答案帮助您解决您所遇到你应该通过点击打勾旁边考虑将其标记为回答这个问题:meta.stackexchange.com/questions/5234/...
达林季米特洛夫

8
但是,您需要使用System.ComponentModel。
yancyn

2
这很有用,谢谢。但是我认为,如果您选择使用它,则答案会更好@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me 2014年

2
也许这是前一阵子写的,但是现在您可以在LabelFor中指定类名:例如@ Html.LabelFor(model => model.SomekingStatus,new {@ class =“ your-css-class”})
ra170

3
但是,如果更新数据库,则会重新生成模型类,并且会丢失该类。您如何避免这种情况?
shim 2014年

30

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

您有3种选择:

  • [DisplayName("Name goes here")]属性添加到数据模型类。不利的一面是,每当您重新生成数据模型时,这些信息就会被丢弃。
  • 将字符串参数添加到中Html.LabelFor。例如@Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})参考:https ://msdn.microsoft.com/zh-cn/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/zh-cn/library/system.componentmodel.dataannotations.metadatatypeattribute(v=vs.110).aspx

笔记:

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

有什么原因为什么在ASP.NET Core 3.1中不起作用?[必需]有效,但不起作用[DisplayName(“ my label”)]
John Pasquet

15

您可以通过使用DisplayName属性修饰属性来更改标签的文本。

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

或者,您可以显式地编写原始HTML:

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

1
@shim:您实际上不应该直接在视图中直接使用数据库/域模型类,通常在它们之间会有一个中间的“视图模型”类。
Vman 2015年

正是我在使用标签语法寻找的东西。谢谢@xander
Asif Iqbal

1
“显式地编写原始HTML”的问题在于,每次使用该表单时,您都必须自己编写标签。最好在模型上声明de DisplayName。
塞萨尔·莱昂


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.