Включая ссылку на скрипт из метода расширения HtmlHelper - PullRequest
2 голосов
/ 31 июля 2009

Вот пример метода расширения для календаря:

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

Функция showCalendar () определена в calendar.js.

Можно ли зарегистрировать ссылку на calendar.js из метода расширения?

Html.Calendar () можно вызывать более одного раза, но должен быть включен только один скрипт.

Ответы [ 3 ]

1 голос
/ 09 января 2012

Краткий ответ: ДА.

А вот и Но ...

Но вам нужно изменить тип возврата. если вы просто вернете строку, она будет закодирована, так что ваш браузер фактически не запустит блок скрипта.

В Chrome что-то вроде этого "" обратите внимание на кавычки. чтобы обойти это, используйте IHtmlString в качестве типа возвращаемого значения и для двойного уверенного возврата helper.Raw.

public static IHtmlString RegisterScripts(this HtmlHelper helper)
    {
        return helper.Raw("<script>function () { DO SOMETHING }</script>");
    }
0 голосов
/ 31 июля 2009

Попробуйте что-то вроде этого, если вы используете WebForms Views ( не проверено ):

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) %>

Надеюсь, что это работает :)

0 голосов
/ 31 июля 2009

Хороший вопрос ... на данный момент я просто делаю другой метод расширения, из которого я возвращаю регистрацию скрипта (скажем, RegisterCalendarScriptBloc ()), но было бы лучше сделать автоматическое включение при первой необходимости зависимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...