Element's value我知道我可以在Html.DisplayFor()中指定一个模板来使用特定的模板来渲染属性,但是在该模板中如何识别要写入span标记的id属性?@Html.DisplayFor(model => m" />

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

asp.net-mvc asp.net-mvc-3 razor asp.net-mvc-4

37119 观看

6回复

8938 作者的声誉

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

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

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

@Html.DisplayFor(model => model.Element, "MyTemplate");
作者: David Clarke 的来源 发布者: 2011 年 4 月 18 日

回应 (6)


7

845111 作者的声誉

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

<span id="@Model.Id">@Html.DisplayFor(x => x.Value)</span>
作者: Darin Dimitrov 发布者: 19.04.2011 06:27

48

8938 作者的声誉

决定

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

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

作者: David Clarke 发布者: 19.04.2011 09:07

1

31 作者的声誉

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

不确定最后一条评论是否有效。它会使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()
作者: Phillip Smith 发布者: 18.04.2012 11:45

2

463 作者的声誉

一篇文章解释了TemplatesRazor中的(Display + Editor),以及UIHint属性。

作者: Yang C 发布者: 16.04.2015 10:31

2

6418 作者的声誉

我阅读了许多关于@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.在Veiw中使用@ Html.DisplayNameFor

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

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

产量

上面的代码在我的example(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>
作者: Ali Soltani 发布者: 13.08.2018 11:14

0

6330 作者的声誉

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

<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. 在嵌套或重复模型的情况下使用@Html.IdForModel()而不是@ViewData.ModelMetadata.PropertyName优选,并且ID不会仅仅是属性名称。
作者: Loren Paulsen 发布者: 04.03.2019 04:26
32x32