包括来自HtmlHelper扩展方法的脚本引用

时间:2009-07-31 12:12:54

标签: asp.net-mvc

以下是日历的示例扩展方法:

public static string Calendar(this HtmlHelper html)
{
    return "<input type='text' onclick='showCalendar(this)'/>";
}

函数showCalendar()在calendar.js中定义。

是否可以通过扩展方法注册对calendar.js的引用?

Html.Calendar()可以多次调用,但只应包含一个脚本。

3 个答案:

答案 0 :(得分:1)

简答:是的。

接下来是......

但您需要更改退货类型。如果你只是返回一个字符串,它将被编码,所以你的浏览器实际上不会运行脚本块。

在Chrome中你会得到像这样的“”注意引号。为了解决这个问题,请使用IHtmlString作为返回类型,并使双重确定返回helper.Raw。

public static IHtmlString RegisterScripts(this HtmlHelper helper)
    {
        return helper.Raw("<script>function () { DO SOMETHING }</script>");
    }

答案 1 :(得分:0)

很好的问题..暂时我只是制作另一个扩展方法,从中返回脚本注册(比如RegisterCalendarScriptBloc()),但最好在第一次需要依赖时自动包含。< / p>

答案 2 :(得分:0)

如果您使用的是WebForms视图(未经过测试),请尝试使用以下内容:

using System.Web.UI.HtmlControls;

public static string Calendar(this HtmlHelper html, HtmlHead head)
{
    var urlHelper = new UrlHelper(html.ViewContext.RequestContext);
    var url = urlHelper.Content("~/Script/calendar.js");

    //var scriptControl = new HtmlGenericControl("script");
    //scriptControl.Attributes.Add("src", url);
    //scriptControl.Attributes.Add("type", "text/javascript");

    //if(head.Controls.Contains(scriptControl))
    //{
    //    head.Controls.Add(scriptControl);
    //}

    // or

    if(!head.Controls.Cast<Control>().Any(x => (x as HtmlGenericControl) != null
        && (x as HtmlGenericControl).Attributes["src"] == url))
    {
        var scriptControl = new HtmlGenericControl("script");
        scriptControl.Attributes.Add("src", url);
        scriptControl.Attributes.Add("type", "text/javascript");

        head.Controls.Add(scriptControl);
    }

    return "<input type='text' onclick='showCalendar(this)'/>";
}

在视图中:

<%= Html.Calendar(Header) %>

希望这有效:)