我需要显示一个标签,其文本是在运行时确定的。
以前,当在编译时知道文本时,我能够使用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)%>
答案 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扩展方法版本。