如何为DisplayFor()创建MVC Razor模板

时间:2011-04-18 23:55:44

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

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

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

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

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

6 个答案:

答案 0 :(得分:49)

好的,我找到了它,实际上非常简单。在我的 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)

这应该与自定义编辑器模板同样有效。

答案 1 :(得分:7)

您可以创建视图模型的id部分并在显示模板中使用它:

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

答案 2 :(得分:3)

我读了很多关于为@Html.DisplayFor定义布尔属性模板的SO帖子,但我不清楚它们。您的问题很接近这个问题,在掌握了这个问题之后,我决定添加一个新的答案,其中包括实现该问题的所有步骤。这可能对其他人有帮助。

1。创建模板

首先,您需要在下面的路径中添加一个Partial View(该路径非常重要):

Views/Shared/DisplayTemplates/

例如,我创建了一个名为Partial View的{​​{1}}并按如下所示填充它:

_ElementTemplate

2。将UIHint添加到模型

要在<span> @(@Model ? "Yes" : "No") </span> property之间建立联系,您应该在模型类中添加如下的template属性:

UIHint

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

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

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

输出

在我的示例(<div> @Html.DisplayFor(modelItem => item.MyProperty) </div> )中,上面的代码呈现为下面的代码:

if (MyProperty == true)

设置属性

要设置<div> <span> Yes </span> </div> 或其他html属性,您可以像这样使用ModelMetadata

id

具有属性的输出

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

答案 3 :(得分:2)

an article解释Razor中的Templates(显示+编辑器)以及UIHint属性。

答案 4 :(得分:1)

我和原帖有完全相同的问题。

不确定最后一条评论是否有效。它会使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()

答案 5 :(得分:1)

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

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

会是这样

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

在首次发布此问题时,这些助手可能并不存在,但这是基于David的回答的两种方式:

  1. 使用@Html.DisplayTextFor(m => m)代替@Model仍将在呈现值的同时利用数据注释,而不仅仅是在其上运行ToString()
  2. 在模型嵌套或重复且ID不能简单地用作属性名称的情况下,最好使用@Html.IdForModel()而不是@ViewData.ModelMetadata.PropertyName