PartialViews 可以替换为 ASP.NET Core 中的 TagHelpers 吗?

vah*_*eds 3 partial-views tag-helpers asp.net-core

我是 ASP.NET Core 的新手。我刚刚发现了 TagHelpers ,正如我可能明白的那样,理论上我们应该能够用tag helpers替换部分视图

除此之外,TagHelper可以接受输入但PartialView不接受。

我觉得对吗?还是误会?任何人都可以清楚地解释其中的区别吗?

提前致谢!

Nic*_*eer 6

这是针对asp.net core 2.1+

如果我正确理解你的问题,你可以用你自己的 TagHelpers 替换你所有的 HtmlHelper 部分视图,但你已经能够用 HtmlHelpers 来做到这一点,所以它不是什么新鲜事。

但是,之间的差异HtmlHelpersTagHelpers以及部分景色。

部分观点

局部视图是一个 Razor 标记文件 (.cshtml),它在另一个标记文件的呈现输出中呈现 HTML 输出。例如_partial.cshtml

HtmlHelper

MVC 框架引入了 HtmlHelpers,以便能够呈现 html 服务器端。通过@剃刀视图中的角色轻松区分。

@await Html.PartialAsync("_partial.cshtml", Model.Contact)
Run Code Online (Sandbox Code Playgroud)

除此之外,TagHelper 可以接受输入但 PartialView 不能。

in 的第二个参数PartialAsync允许输入。

标签助手

使用 asp.net-core,TagHelpers 是另一种能够通过在 razor 视图中使用标签和属性来呈现服务器端 html 的方法。除了对 html 友好的视图之外,它还提供了较少的 html 抽象。在下面的代码中,我使用了 Partial TagHelper,其中name属性定义了视图的路径或名称,而for属性分配了将评估的模型表达式 (@Model)。这意味着您不需要使用for="@Model.Contact",只需使用for="Contact".

<partial name="_partial" for="Contact" />
Run Code Online (Sandbox Code Playgroud)

您还可以使用模型属性,它只是在实例化时将模型传递给局部视图。

<partial name="_partial" model='new Contact { Id = 1, Name = "Nick" }' />
Run Code Online (Sandbox Code Playgroud)

从上面可以看出,TagHelpers 和 HtmlHelpers 都可以渲染局部视图。

此外,如果您查看 HtmlHelper 的 asp.net-core github

https://github.com/aspnet/Mvc/blob/b18526cdc8d8c868e8d7f9c6c8484064215e1002/src/Microsoft.AspNetCore.Mvc.ViewFeatures/HtmlHelper.cs#L554

并将其与 TagHelper 进行比较

https://github.com/aspnet/Mvc/blob/b18526cdc8d8c868e8d7f9c6c8484064215e1002/src/Microsoft.AspNetCore.Mvc.TagHelpers/PartialTagHelper.cs#L216

两者实际上都在调用和IView.RenderAsync()传递ViewContext包含局部视图的 a 。所以他们实际上在后面的代码中做同样的事情,除了它操纵 html 的方式。

旁注:

  • 与 HtmlHelpers 非常相似,您也可以创建自己的 TagHelpers,它可以替换整个部分视图。
  • TagHelpers 不是替代 HtmlHelpers,而是提供替代方法。但是,在我看来 TagHelpers 更好。它们在 Visual Studio 编辑器中呈现得更好(由于 @HtmlHelpers,使用的剃刀页面有很多格式问题),可读性更高,并且符合 html。
  • 在部分中TagHelper,您可以使用modelfor向部分提供数据,但不能同时使用。
  • 从名称中省略 .cshtml 只会强制框架在 Pages、Views 和 Shared 文件夹中搜索视图。它完全可选。

希望这可以帮助