Такой подход реализован, например в Microsoft ASP.NET AJAX. Там у элемента управления ScriptManager есть ScriptManagerProxy, с помощью которого можно устанавливать декларативно свойства у ScriptManager на страницах и пользовательских элементах управления (если, например, сам ScriptManager объявлен в Master Page).
P.S. А вообще, я сам все скрипты содержу в одном файле (типа "оптимизация"), покуда это возможно по объёмам :)
public sealed class ScriptIncluder : Control
{
private string _path;
public string Path
{
get { return _path; }
set
{
_path = ResolveClientUrl(value);
if (!Page.ClientScript.IsClientScriptIncludeRegistered(Page.GetType(), _path))
Page.ClientScript.RegisterClientScriptInclude(Page.GetType(), _path, _path);
}
}
}
Мне кажется, что суть в том, что надо стремиться к максимуму декларативности, поэтому я и решил написать по-быстому соответствующий элемент управления.
Не знаю насчёт 1.0, но в 1.1 подобные методы были реализованы прямо в классе Page. А во втором фреймворке эти методы инкапсулировали в классе ClientScriptManager.
Ещё один вариант - написать свой элемент управления, чтобы задавать скрипты в декларативном виде. Что-то такое:
public sealed class ScriptIncluder : Control
{
private Dictionary _scripts
{
get
{
return (Dictionary )(Context.Items[typeof(ScriptIncluder)] ?? (Context.Items[typeof(ScriptIncluder)] = new Dictionary ()));
}
}
private string _path;
public string Path
{
get { return _path; }
set
{
_path = Page.Server.MapPath(value);
Dictionary dict = _scripts;
if (!dict.ContainsKey(_path))
dict.Add(_path, false);
}
}
protected override void Render(HtmlTextWriter writer)
{
if (String.IsNullOrEmpty(_path))
return;
P.S. А метод AppendFormat всё-таки медленее двух Append.
if (list == null || list.Count
Лучше переписать начало метода:
if (list == null || list.Count
P.S. А вообще, я сам все скрипты содержу в одном файле (типа "оптимизация"), покуда это возможно по объёмам :)
Лучше, конечно было сделать так:
public sealed class ScriptIncluder : Control
{
private string _path;
public string Path
{
get { return _path; }
set
{
_path = ResolveClientUrl(value);
if (!Page.ClientScript.IsClientScriptIncludeRegistered(Page.GetType(), _path))
Page.ClientScript.RegisterClientScriptInclude(Page.GetType(), _path, _path);
}
}
}
Мне кажется, что суть в том, что надо стремиться к максимуму декларативности, поэтому я и решил написать по-быстому соответствующий элемент управления.
public sealed class ScriptIncluder : Control
{
private Dictionary _scripts
{
get
{
return (Dictionary )(Context.Items[typeof(ScriptIncluder)] ?? (Context.Items[typeof(ScriptIncluder)] = new Dictionary ()));
}
}
private string _path;
public string Path
{
get { return _path; }
set
{
_path = Page.Server.MapPath(value);
Dictionary dict = _scripts;
if (!dict.ContainsKey(_path))
dict.Add(_path, false);
}
}
protected override void Render(HtmlTextWriter writer)
{
if (String.IsNullOrEmpty(_path))
return;
Dictionary dict = _scripts;
bool alreadyRendered = dict[_path];
if (!alreadyRendered)
{
writer.Write(@" ", _path);
dict[_path] = true;
}
}
}
Использование:
<mycontrols:ScriptIncluder runat="server" Path="~/js/my_script.js" />