32

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

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

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

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

6 回答 6

60

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

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

于 2011-04-19T21:07:55.363 回答
10

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

1. 创建模板

首先需要Partial View在下面添加一个in路径(路径很重要):

Views/Shared/DisplayTemplates/

例如,我创建了一个Partial View命名_ElementTemplate并像这样填充它:

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

2.在模型中添加UIHint

property要在您的和之间建立连接template,您应该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>
于 2018-08-13T11:14:37.663 回答
7

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

<span id="@Model.Id">@Html.DisplayFor(x => x.Value)</span>
于 2011-04-19T06:27:41.650 回答
3

There's an article explaining the Templates (Display + Editor) in Razor, and also the UIHint attribute.

于 2015-04-16T10:31:26.743 回答
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()
于 2012-04-18T11:45:58.603 回答
1

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

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

会是这样的:

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

首次发布此问题时,这些助手可能不存在,但这以两种方式建立在大卫的回答之上:

  1. 使用@Html.DisplayTextFor(m => m)而不是@Model在渲染值时仍会使用数据注释,而不是仅仅在其上运行ToString()
  2. 在模型嵌套或重复的情况下,使用@Html.IdForModel()而不是@ViewData.ModelMetadata.PropertyName更可取,并且 ID 不会简单地成为属性名称。
于 2019-03-04T04:26:15.647 回答