【问题标题】:MVC3 Display templatesMVC3 显示模板
【发布时间】:2011-12-07 17:43:16
【问题描述】:

我创建了自定义编辑器模板和显示模板。我已将这些类型中的每一种都放在了我的视图文件夹中的一个文件夹中。这些文件夹被命名为 EditorTemplate 或 DisplayTemplate,具体取决于创建的模板类型。

所以,现在我可以使用 EditorFor 来使用我的自定义编辑器模板,或者 DisplayFor 作为我的自定义编辑器模板。

我想为 LabelFor 创建一个自定义模板,但我没有找到这样的示例。我会在我的 Views 文件夹中创建一个名为 Labeltemplate 的文件夹并将其添加到此处吗?

更新

我试图扩展 LabelFor 的原因是为了处理 KeyValuePair 类型的属性。我想用这个属性的Key作为Label,值作为Display。我问了一个问题here 关于 DisplayFor 来处理值。

我的解决方案最终是>

   @Html.DisplayFor(m => m.MyProperty, @Model.MyProperty.Key)

谢谢,

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    LabelFor 不使用任何模板。它在 MVC 源代码中进行了硬编码,无论您做什么,它都会吐出 <label>

    如果你想修改这个行为,你必须编写一个自定义的 html 助手。

    另一方面,如果你想使用模板,你必须使用 EditorFor/DisplayFor 助手。因此,由于标签用于显示目的,您可以使用显示模板而不是使用Html.LabelFor(x => x.Foo) 使用Html.DisplayFor(x => x.Foo)。就自定义模板而言,您可以使用[UIHint] 属性装饰Foo 属性,或者将其作为第二个参数传递给DisplayFor 助手。


    更新:

    根据您的评论,您没有尝试修改标记,而只是尝试修改值。这就是 LabelFor 助手的第二个参数可以用于:

    @Html.LabelFor(x => x.Foo, Model.Key)
    @Html.EditorFor(x => x.Foo)
    

    这会创建一个与 Foo 输入相关联的标签(正确分配标签的for 属性),但显示的文本是您的视图模型上的Key 属性的文本。

    【讨论】:

    • 我对标签很好,但我想将标签的内部文本设置为助手使用的值以外的值。我的属性是一个键值对,我想将标签设置为属性的“键”。有什么想法吗?
    • 小心使用“DisplayFor”。您的解决方案可以工作,但 DisplayFor 旨在用于创建值的“只读”显示,而不是为属性创建标签。我的意思是“日期时间”的 DisplayFor 将用于自定义显示数据时间的格式。您的自定义模型或类的“DisplayFor”模板将输出值。
    • 也许我只是对标签进行硬编码,根本不使用帮助器。
    • @JeffReddy,这就是 LabelFor 助手的第二个参数可以用于:@Html.LabelFor(x => x.Foo, Model.Key)。这将为 Foo 输入生成一个标签,但使用的值将是视图模型上 Key 属性的值。
    【解决方案2】:

    不支持为特定的 HTML Helper 方法 (LabelFor) 创建模板。

    你可以:

    使用元描述符标记您的模型以更改作为标签的一部分显示的值:

     [DisplayName("Custom Label")]
     public string Test {get;set;}
    

    您可以创建自己的自定义 HTML Helper 方法来输出标签:

    How can I override the @Html.LabelFor template?

    【讨论】:

    • 我尝试了该问题中提供的解决方案,但我需要 KeyValuePair 属性中的“键”值。他的问题涉及标签的格式(添加了一个跨度标签)。
    • 那篇文章中的代码对你来说并不是一个“最终解决方案”,它并不是要为你提供创建可以做你想做的 HTML Helper 的基本代码。
    • 它确实为我提供了基础知识,但缺少一个关键元素,即属性的值。似乎代码仅适用于属性的元数据,但不适用于值。这就是我真正需要的,但不确定它是否可用。
    【解决方案3】:

    您可以创建一个 DisplayTemplate 并通过模板名称访问它:

    @Html.DisplayFor(x => x.Foo, "label")
    

    然后只需在您的 DisplayTemplates 文件夹中创建一个名为 label.cshtml 的模板。

    为了简化这个调用,你可以编写一个处理这个调用的扩展方法:

    public static MvcHtmlString TemplateLabelFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> property) 
    {
        return html.DisplayFor(property, "label");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      相关资源
      最近更新 更多