Правильный способ включения скриптов на страницу asp.net

У меня есть приложение ASP.NET, в котором используется смесь ASP.NET AJAX (включая UpdatePanel) и jQuery, написанная несколькими разработчиками с разным опытом.

Некоторые включали сценарии в сам ScriptManager <asp:ScriptManager><Scripts><asp:ScriptReference...., в то время как другие использовали Page.ClientScript.RegisterClientScriptInclude в коде позади, а третьи использовали прямое <script src=""> для включения сценариев.

Я хотел бы объединиться с одним способом справиться с этим, если это возможно, но я не уверен, каковы плюсы и минусы каждого способа и какой из них предпочтительнее.


Одним из примеров может быть:

protected override void Render(HtmlTextWriter writer)
 {
    Page.ClientScript.RegisterClientScriptInclude("jQuery", ResolveClientUrl("~/scripts/jquery/js/jquery-1.4.2.min.js"));    
    base.Render(writer);
}

vs

<asp:ScriptManager ID="ScriptManager1" runat="server">
    <Scripts>
        <asp:ScriptReference Path="~/scripts/jquery/js/jquery-1.4.2.min.js" />
    </Scripts>
</asp:ScriptManager>

vs

<script src="Scripts/jQuery/js/jquery-1.4.2.min.js" type="text/javascript"></script>

person Greg    schedule 07.07.2010    source источник


Ответы (3)


Не всегда возможно включить в разметку весь сценарий.
Если сценарий зависит от динамических данных, вам потребуется "внедрить" сценарий из исходного кода.

Мое правило состоит в том, чтобы всегда стараться избегать «внедрения» скрипта из кода, если это возможно, и использовать это только в крайнем случае.

Редактировать:
Если у вас много разных файлов сценариев, предпочтительнее использовать диспетчер сценариев.
При использовании диспетчера сценариев все сценарии будут "объединены" в один файл. Это влияет на то, как браузер загружает скрипты. Браузеры обычно имеют ограничение в 2 одновременных подключения, и если у вас есть 10 скриптов, вам нужно будет загрузить их все за 5 шагов. Scriptmanager позаботится о том, чтобы все это произошло за один шаг.

person Sani Singh Huttunen    schedule 07.07.2010
comment
От динамических данных ничего не зависит, поэтому я бы предпочел перенести их в разметку. Я чувствую, что поместить их в ScriptManager было бы лучше, но у меня нет ничего, чтобы поддержать это. - person Greg; 07.07.2010

<asp:scriptreference> является декларативным эквивалентом вызова ScriptManager.RegisterScriptBlock(), так же как любое другое объявление элемента управления asp.net похоже на выполнение программного Controls.Add().

При этом на самом деле не существует «предпочтительного способа». Если вы создаете распространяемые веб-элементы управления, вам следует вызывать различные .RegisterScript...() методы из процедур настройки вашего элемента управления, а не полагаться на то, что пользователь должен добавить разметку.

Если вы просто хотите включить скрипты в веб-сайт, вероятно, удобнее использовать метод разметки.

Если вы добавляете сценарии во время вызовов Ajax, вам следует использовать для этого ScriptManager. Если вы добавляете скрипты к обычным обратным передачам, вам следует использовать для этого ClientScriptManager.

Так что... сложно перечислить плюсы и минусы. В вашем случае, если вы не создаете распространяемый код, то наиболее очевидным и простым способом является включение ссылок на скрипты через разметку, потому что она более заметна. Но я не уверен, что вы сможете объединить каждое вхождение в один метод, потому что все методы существуют не просто так, и вам может понадобиться использовать более одного.

person womp    schedule 07.07.2010
comment
Отличный ответ. Это дает мне лучшее представление о том, когда использовать каждый подход, и в моем случае это просто включение скриптов в веб-сайт. Я не думаю, что наш script-includes различается между get и post. - person Greg; 07.07.2010

Я бы порекомендовал загрузчик сценариев Ajax (если вы работаете в asp.net, библиотеке asp.net ajax, среде jquery)

http://www.asp.net/ajaxlibrary/Ajax%20Script%20Loader.ashx

http://www.asp.net/ajaxlibrary/КАК%20TO%20Объединить%20Scripts%20используя%20the%20Script%20Loader.ashx

person Raj Kaimal    schedule 07.07.2010