2009-07-31 3 views
2

Вот метод расширения выборки для календаря:опорного сценария от метода расширения HtmlHelper

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

Функция ShowCalendar() определяется в calendar.js.

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

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

ответ

0

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

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

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

1

Short ответ: ДА.

Здесь приходит но ...

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

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

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