asp.net-core - 为什么 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 助手会是更好的做法。
我认为开发人员这样做是有原因的,但这可能是什么让我无法理解。任何人都可以为我阐明一下吗?
解决方案
很简单:没有用于显示的标签助手。
扩展:
为诸如输入之类的事情提供标签助手是有意义的:有与之相关的特定 HTML 标签。显示变得更加模糊。每个单独的开发人员可能希望使用不同的标签来显示:span
、strong
、th
、dt
等。这里没有一刀切的。您甚至可能根本不需要标签。默认情况下Html.DisplayFor
,Html.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
需要考虑小数、日期时间等问题。
推荐阅读
- c# - 有没有一种直接的方法可以将 WPF .NET Framework 应用程序转换为 UWP .NET Core?
- php - 如何在php中检查日期范围列表中的日期范围
- python - 是否可以设置 Pika SelectConnection 轮询间隔?
- php - 如何使用 Silverstripe 控制器默认返回 JSON?
- events - 此触发什么事件以及如何取消它?
- java - 将 tflite 模型文件加载到项目中时,MAPPEDBYTEBUFFER 不是有效的 FLATBUFFER 模型
- sql - 插入需要事务的 Select 语句
- html - 将数据加载到表中后如何将表头与表体对齐
- c++ - OpenCV不会加载图像
- java - 如何导入maven嵌套项目