1

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

以前,当文本在编译时已知时,我能够使用 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 需要在运行时确定。

根据这个 StackOverflow 答案,没有办法使用 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)%>
4

2 回答 2

1

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

@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>
于 2012-11-07T22:39:22.253 回答
0

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

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

于 2012-11-07T22:35:35.043 回答