65.9K
CodeProject 正在变化。 阅读更多。
Home

Razor 助手语法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (5投票s)

2011年7月22日

CPOL

3分钟阅读

viewsIcon

26688

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(这对于 TagBuilderMvcHtmlString 类是必需的)

@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 目录并将助手文件移动到其他应用程序。选择权在你手中,所以选择你认为最适合你的实现方式。

© . All rights reserved.