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

Dav*_*rke 27 asp.net-mvc razor asp.net-mvc-3 asp.net-mvc-4

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

<span id="ElementsId">Element's value</span>
Run Code Online (Sandbox Code Playgroud)

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

@Html.DisplayFor(model => model.Element, "MyTemplate");
Run Code Online (Sandbox Code Playgroud)

Dav*_*rke 53

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

@model System.Int32
<span id="@ViewData.ModelMetadata.PropertyName">@Model</span>
Run Code Online (Sandbox Code Playgroud)

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

<span id="Reading">1234</span>
Run Code Online (Sandbox Code Playgroud)

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

@Html.DisplayFor(model => model.Reading, "Reading")
Run Code Online (Sandbox Code Playgroud)

或者,如果模型属性使用UIHint("Reading")进行修饰,则模板名称可以不在对DisplayFor()的调用之外,它仍将使用模板进行渲染:

@Html.DisplayFor(model => model.Reading)
Run Code Online (Sandbox Code Playgroud)

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

  • 我实际测试了这个,如果你创建一个名为`Int32.cshtml`的文件,其模型为`System.Int32?`,你将覆盖默认模板,它将被两个版本的int32(可空和不可为空)拾取. (4认同)

Ali*_*ani 10

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

1. 创建模板

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

Views/Shared/DisplayTemplates/
Run Code Online (Sandbox Code Playgroud)

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

<span>
    @(@Model ? "Yes" : "No")
</span>
Run Code Online (Sandbox Code Playgroud)

2.在模型中添加UIHint

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

[UIHint("_YesOrNoTemplate")]
public bool MyProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

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

<div>
    @Html.DisplayFor(modelItem => item.MyProperty)
</div>
Run Code Online (Sandbox Code Playgroud)

输出

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

<div>
    <span>
        Yes
    </span>
</div>
Run Code Online (Sandbox Code Playgroud)

设置属性

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

<span id="@ViewData.ModelMetadata.PropertyName">
    @(@Model ? "Yes" : "No")
</span>
Run Code Online (Sandbox Code Playgroud)

带属性的输出

<div id="MyProperty">
    <span>
        Yes
    </span>
</div>
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 7

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

<span id="@Model.Id">@Html.DisplayFor(x => x.Value)</span>
Run Code Online (Sandbox Code Playgroud)