在MVC3模型中显示运行时数据时DisplayName DataAnnotation的替代方法

时间:2012-11-07 22:23:50

标签: c# asp.net-mvc asp.net-mvc-3

我需要显示一个标签,其文本是在运行时确定的。

以前,当在编译时知道文本时,我能够使用DisplayName DataAnnotation来制作我的模型如何表示其数据。

作为一个例子,我曾经有过:

[DisplayName("Task Template")]
public List<KeyValuePair<int, string>> TaskTemplate { get; set; }

<%= Html.LabelFor(model => model.TaskTemplate) %>
<%= Html.DropDownListFor(model => model.TaskTemplateFlag, new SelectList(Model.TaskTemplate, "Key", "Value"))%>

但现在需要在运行时确定DisplayName。

根据this StackOverflow answer,无法使用DataAnnotation执行此操作。

我想知道最佳做法是什么?我是否完全停止使用LabelFor?我应该只在模型中存储一堆字符串属性,将我的值加载到属性中,然后使用DisplayFor进行渲染吗?

更新:我认为这可能是一个足够好的解决方案:

public string TaskTemplateLabel { get; set; }
public List<KeyValuePair<int, string>> TaskTemplate { get; set; }

//Constructor: TaskTemplateLabel = GetLabelFromDataSource();

<%= Html.LabelFor(model => model.CurrentDeviceName, Model.TaskTemplateLabel)%>

2 个答案:

答案 0 :(得分:1)

根据我的理解,这就像使用LabelFor html助手的重载一样简单

@Html.LabelFor(x => item.ID, item.ID.ToString())

在上面的示例中,将为ID属性创建标签,文本实际属性

这是渲染结果:

<label for="item_ID">7061207d-4ad4-45dd-aada-8335b98538c3</label>

将此与传统示例进行比较:

@Html.LabelFor(x => item.ID)

呈现:

<label for="item_ID">ID</label>

答案 1 :(得分:0)

如果在运行时确定标签文本所需的所有输入在编译时可用,则可以构建自己的数据注释属性,该属性继承自DisplayName属性。虽然我不确定您是否可以从DisplayName类继承。它可能是密封的。

另一种选择是实现自己的LabelFor扩展方法版本。