创建一个返回Razor @标签的辅助函数?

时间:2012-02-16 08:26:59

标签: c# asp.net asp.net-mvc-3 razor extension-methods

努力寻找我的问题的答案,因为我不确定剃刀标签的'类型'是什么。

基本上我想创建一个帮助器,它可以沿着这些方向做某些事情:

public static xxxxxxx ScriptTag(this HtmlHelper htmlHelper, string url)
{
      return @<script type="text/javascript" src="@Url.Content("~/" + url)" />;
}

我想要的原因是我正在实施this post中概述的扩展方法。

基本上而不是必须这样做:

@Html.Resource(@<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>, "js")`

我希望能够做到:

@Html.Resource(Html.ScriptTag("Scripts/jquery-1.4.4.min.js"), "js");

我是否能够超越星星,或者这可能吗?

克里斯

3 个答案:

答案 0 :(得分:4)

我没有在ScriptTag帮助器(js)中看到第二个参数的使用情况。帮助程序称为ScriptTag,因此很明显它将呈现脚本。另外,为什么你可以直接拥有这样的2个嵌套助手:

@Html.Resource("Scripts/jquery-1.4.4.min.js", "js")

但无论如何,如果你需要这样的语法,你可以使用Razor Templated Delegates

public static class HtmlExtensions
{
    public static HelperResult ScriptTag(this HtmlHelper htmlHelper, string url, string type)
    {
        var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
        var script = new TagBuilder("script");
        script.Attributes["type"] = "text/javascript";
        script.Attributes["src"] = urlHelper.Content("~/" + url);
        return new HelperResult(writer =>
        {
            writer.Write(script.ToString(TagRenderMode.Normal));
        });
    }

    public static IHtmlString Resource(this HtmlHelper htmlHelper, HelperResult renderer)
    {
        return renderer;
    }
}

正如我们所看到的,Resource扩展方法在这种情况下并没有带来多大价值。

答案 1 :(得分:0)

您可以通过为HtmlHelper类型创建扩展方法来解决此问题。

例如:

public static MvcHtmlString ScriptTag(this HtmlHelper htmlHelper, string contentPath,
    string scriptType)
{
    var httpContext = htmlHelper.ViewContext.HttpContext;

    var scriptTag = String.Format("<script src=\"{0}\" type=\"{1}\"></script>",
        UrlHelper.GenerateContentUrl(contentPath, httpContext),
        scriptType);

    return new MvcHtmlString(scriptTag);
}

然后,您可以按如下方式使用自定义Html帮助程序方法:

@Html.ScriptTag("Scripts/jquery1.6.1.min.js", "javascript/text");

答案 2 :(得分:0)

当函数的结果是纯HTML时,我喜欢使用Razor Helpers

在您的视图文件中,创建一个类似的语句:

@helper ScriptTag(string url) {
    <script type="text/javascript" src="@Url.Content("~/" + url)"></script>
}

然后用法就像

@ScriptTag("myScript.js")

Razor Helpers在

中返回HTML