Razor 助手语法
Razor 助手语法
Razor 视图引擎的一个隐藏的优势是声明式助手语法。使用这种语法,我们可以创建存储为 .cshtml 文件的助手组件,并实现视图代码的重用。这种语法的名称听起来很熟悉,因为它让人联想到 MVC 1 中提供的 HtmlHelper
类。在这篇文章中,我将解释 Razor 助手语法,并讨论为什么它听起来像 HtmlHelper
。
@helper 语法和 HtmlHelper 类
当你想要封装视图代码并使其可重用时,你可能会创建一个扩展方法来扩展 HtmlHelper
类。通过这样做,当需要该视图代码时,你只需要调用带有你创建的方法名称的 @Html
。这里有一个用于构建简单 HTML5 video 标签的 HtmlHelper
方法示例
public static class HtmlHelpers
{
public static MvcHtmlString Video(this HtmlHelper helper, string id, string sourceUrl, bool controls)
{
TagBuilder builder = new TagBuilder("video");
builder.MergeAttribute("id", id);
builder.MergeAttribute("src", sourceUrl);
if (controls)
{
builder.MergeAttribute("controls", "controls");
}
return new MvcHtmlString(builder.ToString(TagRenderMode.Normal));
}
}
以及将其集成到视图中
@{
ViewBag.Title = "Home Page";
}
@using AsyncMVC
<h2>@ViewBag.Message</h2>
<p>
To learn more about ASP.NET MVC visit
<a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
@Html.Video("prolog", Url.Content("~/Prolog.mov"), true)
Razor 视图引擎使其更加容易。你可以使用 @helper
语法在视图中创建内联助手代码(无需创建扩展方法),或者将其作为单独的 cshtml 文件使其可重用。它是如何工作的?让我们看一个内联示例
ViewBag.Title = "Home Page";
}
<h2>@ViewBag.Message</h2>
<p>
To learn more about ASP.NET MVC visit
<a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
@helper Video(string id, string sourceUrl, bool controls)
{
TagBuilder builder = new TagBuilder("video");
builder.MergeAttribute("id", id);
builder.MergeAttribute("src", sourceUrl);
if (controls)
{
builder.MergeAttribute("controls", "controls");
}
var video = new MvcHtmlString(builder.ToString());
@video
}
@Video("prolog", Url.Content("~/Prolog.mov"), true)
正如你所见,HtmlHelper
中的大部分代码被转移到视图中,只是稍微修改了一下,使用变量来表示返回类型。这种内联代码使得调用方法更容易(无需在中间使用 HtmlHelper
类),并且我们不需要在应用程序中创建扩展方法。另一方面,使用内联代码无法在视图范围之外重用,那么我们该怎么办?我们可以将助手块分离到不同的 cshtml 文件中,并在其他应用程序视图中使用它。
将助手分离到它们自己的文件中
为了将 Razor 助手放入它们自己的 cshtml 文件中,你必须将 App_Code 目录添加到你的 MVC 应用程序中。在应用程序项目中,创建一个名为 App_Code
的新目录。ASP.NET 将此目录名称视为特殊目录名称,因此它将获得一个特殊图标。创建目录后,将一个视图(cshtml 文件)添加到其中,并将其命名为 Helpers(例如)
在创建的 cshtml 文件中,删除来自先前代码块的助手代码,并添加一个 using
语句来引用 System.Web.Mvc
(这对于 TagBuilder
和 MvcHtmlString
类是必需的)
@using System.Web.Mvc
@helper Video(string id, string sourceUrl, bool controls)
{
TagBuilder builder = new TagBuilder("video");
builder.MergeAttribute("id", id);
builder.MergeAttribute("src", sourceUrl);
if (controls)
{
builder.MergeAttribute("controls", "controls");
}
var video = new MvcHtmlString(builder.ToString());
@video
}
构建解决方案后,现在可以像以下这样使用之前的视图
@{
ViewBag.Title = "Home Page";
}
<h2>@ViewBag.Message</h2>
<p>
To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">
http://asp.net/mvc</a>.
</p>
@Helpers.Video("prolog", Url.Content("~/Prolog.mov"), true)
现在视频助手是可重用的,你可以在应用程序中的所有视图中使用它。
摘要
Razor 助手语法非常实用,可以帮助你在无需扩展方法的情况下创建助手。另一方面,这并不意味着 HtmlHelper
扩展没有好处。由于你可以将它们放在不同的类库中,因此可以在其他应用程序中重用它们的代码。使用助手语法,你必须创建 App_Code 目录并将助手文件移动到其他应用程序。选择权在你手中,所以选择你认为最适合你的实现方式。