【问题标题】:Why does Razor Pages scaffolding use HTML Helpers (and not Tag Helpers) for Index, Details and Delete pages?为什么 Razor 页面脚手架对索引、详细信息和删除页面使用 HTML 帮助程序(而不是标记帮助程序)?
【发布时间】:2019-09-06 15:58:43
【问题描述】:

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

        <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 助手来显示数据。即

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

这个来自 Microsoft 的 link 说:“Tag Helpers 减少了 Razor 视图中 HTML 和 C# 之间的显式转换。在许多情况下,HTML Helpers 为特定 Tag Helper 提供了一种替代方法,但重要的是要认识到 Tag Helpers不要替换 HTML Helper,并且每个 HTML Helper 都没有一个 Tag Helper。"。

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

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

【问题讨论】:

    标签: asp.net-core html-helper razor-pages scaffolding tag-helpers


    【解决方案1】:

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

    扩展:

    为诸如输入之类的事情提供标签助手是有意义的:有与之相关的特定 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" />
    

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

    【讨论】:

    • 好的,我想这是有道理的,但我的问题中带有标签和跨度的顶级示例不会被视为非输入字段的标签助手吗?
    • 我只是举了一个input的例子。在标签的情况下,HTML 元素显然是label。在验证的情况下,他们基本上只是武断地决定元素将是span,但必须选择一些东西,span 才有意义。我想您可能会争辩说,他们应该为仅使用 span 的显示制作标签助手,但我认为这实际上更令人反感。尽管验证需要某种包装元素,但 display 不需要。纯粹主义者不喜欢强加无关标签。
    猜你喜欢
    • 2020-09-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2023-04-08
    相关资源
    最近更新 更多