【问题标题】:How do I create a MVC Razor template for DisplayFor()如何为 DisplayFor() 创建 MVC Razor 模板
【发布时间】:2011-08-08 06:48:42
【问题描述】:

我的视图模型中有几个仅显示的属性,但我需要使用 jQuery 检索它们的值以在页面上执行计算。标准的 Html.DisplayFor() 方法只是将它们的值写入页面。我想创建一个剃刀模板,让我可以将每个元素呈现为:

<span id="ElementsId">Element's value</span>

我知道我可以在 Html.DisplayFor() 中指定一个模板以使用特定模板来呈现属性,但在该模板中我如何识别 id 属性写入 span 标签?

@Html.DisplayFor(model => model.Element, "MyTemplate");

【问题讨论】:

    标签: asp.net-mvc asp.net-core asp.net-mvc-4 asp.net-mvc-3 razor


    【解决方案1】:

    我阅读了许多关于为布尔属性定义 @Html.DisplayFor 模板的 SO 帖子,但我无法清楚地理解它们。你的问题已经结束了,在掌握了它之后,我决定添加一个新的答案,包括实现它所需的所有步骤。它可能对其他人有帮助。

    1.创建模板

    首先需要在下面的路径中添加Partial View(路径很重要):

    Views/Shared/DisplayTemplates/
    

    例如,我创建了一个名为_ElementTemplatePartial View 并像这样填充它:

    <span>
        @(@Model ? "Yes" : "No")
    </span>
    

    2。在模型中添加UIHint

    要在propertytemplate 之间建立连接,您应该在模型类中添加UIHint 属性,如下所示:

    [UIHint("_YesOrNoTemplate")]
    public bool MyProperty { get; set; }
    

    3.在视图中使用@Html.DisplayNameFor

    在您需要此属性的每个视图中,您可以使用以下代码:

    <div>
        @Html.DisplayFor(modelItem => item.MyProperty)
    </div>
    

    输出

    上面的代码在我的示例中呈现为下面的代码(if (MyProperty == true)):

    <div>
        <span>
            Yes
        </span>
    </div>
    

    设置属性

    要设置id 或其他html 属性,您可以像这样使用ModelMetadata

    <span id="@ViewData.ModelMetadata.PropertyName">
        @(@Model ? "Yes" : "No")
    </span>
    

    带有属性的输出

    <div id="MyProperty">
        <span>
            Yes
        </span>
    </div>
    

    【讨论】:

    • 我认为您可能错过了问题的重点 - 我对如何呈现元素 id 特别感兴趣
    • @DavidClarke 你是对的。我忘了。我添加了id 属性。
    • 这个答案比大多数成熟的文章写得更好:-)
    【解决方案2】:

    构建将输出以下内容的显示模板的最佳方法:

    <span id="ElementsId">Element's value</span>
    

    会是这样的:

    <span id="@Html.IdForModel()">@Html.DisplayTextFor(m => m)</span>
    

    当这个问题第一次发布时,这些助手可能不存在,但这建立在大卫的回答的两个方面:

    1. 使用@Html.DisplayTextFor(m =&gt; m) 而不是@Model 在呈现值时仍会使用数据注释,而不是仅仅在其上运行ToString()
    2. 在模型嵌套或重复的情况下,最好使用@Html.IdForModel() 而不是@ViewData.ModelMetadata.PropertyName,并且ID 不仅仅是属性名称。

    【讨论】:

      【解决方案3】:

      您可以将这个id 作为视图模型的一部分并在显示模板中使用它:

      <span id="@Model.Id">@Html.DisplayFor(x => x.Value)</span>
      

      【讨论】:

        【解决方案4】:

        an article 解释了 Razor 中的 Templates(显示 + 编辑器),还有 UIHint 属性。

        【讨论】:

        • 关于使用模板的好文章。对我来说就像一个冠军。
        【解决方案5】:

        我遇到的问题与原帖完全相同。

        不确定最后一条评论是否有效。它会使 HTML id 属性成为运行时值,因此不能用设计时名称引用。

        我使用了 DisplayFor 的重载,它允许您将新对象添加到数据字典(ViewBag)中

        我的模型是一个名为 Project 的 C# 对象,具有各种属性。在我看来,我有这个:

        @Html.DisplayFor(model => model.ProjectName, "StringDisplaySetHtmlID", new { HtmlID = "project-name" })
        

        这是使用名为 StringDisplaySetHtmlID 的自定义模板,最后一个参数将键值对添加到 Viewbag。

        我的模板文件如下所示:

        @model string
        <span class = "display-field" id = "@(ViewBag.HtmlID)">@Model</span> 
        

        我还在此处设置了一个类以进行样式设置。我使用了键名 HtmlID 而不仅仅是 ID 以避免潜在的常见命名冲突。

        现在在我的 javascript 中,我可以使用以下 jquery 获取 span 的内容:

        var projectName = $('#project-name').text()
        

        【讨论】:

          【解决方案6】:

          好的,我找到了它,它实际上非常简单。在我的 Views\Shared\DisplayTemplates 文件夹中,我有 Reading.cshtml 包含以下内容:

          @model System.Int32
          <span id="@ViewData.ModelMetadata.PropertyName">@Model</span>
          

          这会使用属性的名称作为 id 属性并使用属性的值作为内容来呈现正确的标记:

          <span id="Reading">1234</span>
          

          在视图文件中,可以使用以下方法调用:

          @Html.DisplayFor(model => model.Reading, "Reading")
          

          或者如果模型属性用 UIHint("Reading") 修饰,那么模板名称可以在调用 DisplayFor() 时省略,它仍然会使用模板渲染:

          @Html.DisplayFor(model => model.Reading)
          

          这应该同样适用于自定义编辑器模板。

          【讨论】:

          • 那么你如何处理System.Int32? (Nullable int)。您不能创建另一个名为 Int32?.cshtml 的视图
          • 视图名为 Reading.cshtml,而不是 Int32.cshtml。因此,如果您有一个Int32? 属性,您将使用@model System.Int32? 创建一个新文件WhateverPropertyIsCalled.cshtml。免责声明:我不记得自己有这个要求,也没有测试过它是否有效。
          • 我实际上对此进行了测试,如果您创建一个名为 Int32.cshtml 且模型为 System.Int32? 的文件,您将覆盖默认模板,它将被 int32 的两个版本(可空和不可为空)。
          • 根据您在模板中输出值的方式,检查 null 并在发生这种情况时提供默认格式可能是个好主意。我只是在一个类似的货币价值模板上做了这个。当用户第一次获取您的表单时,该值将为 null(尚未输入任何内容。)
          • 我使用的是可配置模板,所以我觉得 foreach 循环只能在我的情况下使用,因为部分视图不方便最终用户使用。
          猜你喜欢
          • 2013-08-23
          • 1970-01-01
          • 2016-07-04
          • 2015-10-06
          • 2016-05-03
          • 1970-01-01
          • 2014-09-20
          • 1970-01-01
          • 2013-06-10
          相关资源
          最近更新 更多