Создать вспомогательную функцию, которая возвращает теги Razor @? - PullRequest
2 голосов
/ 16 февраля 2012

Изо всех сил пытаюсь найти ответ на мой вопрос, так как я не совсем уверен, что является «типом» тега бритвы.

По сути, я хочу создать помощника, который делает что-то вроде этого:

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

Причина, по которой я хочу это, заключается в том, что я реализую методы расширения, описанные в этом посте .

В основном, а не в том, чтобы делать:1011 *

Я хочу иметь возможность:

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

Достигаю ли я здесь сверх звезд или это возможно?

Крис

Ответы [ 3 ]

4 голосов
/ 16 февраля 2012

Я не совсем вижу использование второго параметра в вашем 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 в этом случае не имеет большого значения.

0 голосов
/ 31 октября 2012

Когда результатом функции является простой HTML, я хотел бы использовать Razor Helpers .

В вашем файле представления создайте оператор, подобный этому:

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

тогда использование будет похоже на

@ScriptTag("myScript.js")

Помощники Razor возвращают HTML в

0 голосов
/ 16 февраля 2012

Это можно решить, создав метод расширения для типа 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");
...