首页 > 解决方案 > 为什么 Razor 页面脚手架对索引、详细信息和删除页面使用 HTML 帮助程序(而不是标记帮助程序)?

问题描述

我最近使用 Razor Pages 开始了我的第一个项目,我正在使用 EF Core 并将我的所有模型搭建到 CRUD Razor Pages 中。我注意到的是,生成的创建和编辑 Razor 页面使用标签助手来显示数据。IE

        <div class="form-group">
            <label asp-for="ViewModel.Name" class="control-label"></label>
            <input asp-for="ViewModel.Name" class="form-control" />
            <span asp-validation-for="ViewModel.Name" class="text-danger"></span>
        </div>

而索引、详细信息和删除页面使用 Html Helpers 来显示数据。IE

    <dt>
        @Html.DisplayNameFor(model => model.ViewModel.Name)
    </dt>
    <dd>
        @Html.DisplayFor(model => model.ViewModel.Name)
    </dd>

这个来自 Microsoft 的链接说“标记帮助程序减少了 Razor 视图中 HTML 和 C# 之间的显式转换。在许多情况下,HTML 帮助程序为特定标记帮助程序提供了一种替代方法,但重要的是要认识到标记帮助程序不会取代 HTML助手,并且每个 HTML 助手都没有标签助手。”。

但是这些基本的显示字段当然可以用 Tag Helpers 显示。在我看来,这似乎是一个相当轻率的不一致,我认为主要使用标签助手和仅在绝对必要时使用 Html 助手会是更好的做法。

我认为开发人员这样做是有原因的,但这可能是什么让我无法理解。任何人都可以为我阐明一下吗?

标签: asp.net-corehtml-helperrazor-pagesscaffoldingtag-helpers

解决方案


很简单:没有用于显示的标签助手。

扩展:

为诸如输入之类的事情提供标签助手是有意义的:有与之相关的特定 HTML 标签。显示变得更加模糊。每个单独的开发人员可能希望使用不同的标签来显示:spanstrongthdt等。这里没有一刀切的。您甚至可能根本不需要标签。默认情况下Html.DisplayForHtml.DisplayNameFor只输出值,没有任何标签。

此外,这些是模板化的助手,这意味着作为开发人员的您实际上可以添加模板Views\Shared\DisplayTemplates并自定义事物的显示方式。例如,您可以在String.cshtml那里查看视图,例如:

@model string
<strong>@Model</strong>

现在,使用显示的任何字符串属性Html.DisplayFor都将被包装在strong标签中。标签助手无法实现这种级别的自定义。

编辑

FWIW,如果你真的想使用标签助手,你可以添加你自己的。例如:

public class DisplayNameTagHelper : TagHelper
{
    public ModelExpression For { get; set; }

    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "strong";
        output.Content.SetContent(For.Metadata.DisplayName);
    }
}

那么在你看来:

<display-name for="MyProperty" />

写 aDisplayTagHelper在概念上是相似的,但有点困难。您可以从中获取值For.Model。但是,这键入为object。使用 上可用的信息For.Metadata,您需要确定您实际使用的是什么,并且可能有几个不同的分支来根据类型以不同的方式显示内容。还For.Metadata.DataFormatString需要考虑小数、日期时间等问题。


推荐阅读