скрипты в контролах

bmikle31
Дата: 23.04.2007 20:50:34
Всем долгим лет. У меня такая проблема:
Я пишу компоненты и наследую их от WebControl. В них используются java скрипты. так вот очень неприятно, что с каждым контролом на форме появляется солидный кусок ява кода. Делать ссылки на js вайлы тоже не годится, так как их бы пришлось вручную добавлять на сайт
Rock-n-Roll Live!!!
iConst
Дата: 23.04.2007 21:25:39
Дык, я не понял - эти скрипты тебе не нужны?

Если не нужны - то переопределяй методы и избавляйся от скриптов. Или наследуйся от Control.

Если код нужен, то какая разница - контрол ли сгенерит его или подключить его вручную, объем кода не изменится.

Так в чем проблема?
Перевернув мир - оглянись, может перевернулся ты сам?!
bmikle31
Дата: 23.04.2007 21:30:10
мне нужно чтобы н JavaScript код не дублировался на странице.
Rock-n-Roll Live!!!
Dimon aka Manowar
Дата: 23.04.2007 22:48:00
Регь скрипты через Page.ClientScript и проверяй перед регисрацией соотв. Is...Registered()
Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
iConst
Дата: 24.04.2007 00:12:13
Этот кусок из Custom Control. Думаю, разберешься:

protected override void OnPreRender(EventArgs e)
{
StringBuilder sbFunction = new StringBuilder();
StringBuilder sbStartupScript = new StringBuilder();
if(!this.Page.IsClientScriptBlockRegistered("LabelScript" + this.ClientID))
{
sbFunction.Append("");
sbFunction.Append("function ChangeLabelText"
+ this.ClientID + "(id){");
sbFunction.Append("var lblDisplay=document.getElementById('lblDisplayText"
+ this.ClientID + "');");
sbFunction.Append("var ddlDropDown=document.getElementById(id);");
sbFunction.Append("lblDisplay.innerText=ddlDropDown.value;}");
sbFunction.Append("");
this.Page.RegisterClientScriptBlock("LabelScript" + this.ClientID, sbFunction.ToString());
}
if(!this.Page.IsStartupScriptRegistered("LabelStartupScript" + this.ClientID))
{
sbStartupScript.Append("");
sbStartupScript.Append("ChangeLabelText"
+ this.ClientID + "('" + this.ClientID + "');");
sbStartupScript.Append("");
Page.RegisterStartupScript("LabelStartupScript"
+ this.ClientID, sbStartupScript.ToString());
}
this.Attributes["onchange"] = "ChangeLabelText" + this.ClientID + "('"
+ this.ClientID + "')";
base.OnPreRender(e);
}



Здесь регистрятся два скрипта - один будет выполняться при загрузке (Page.RegisterStartupScript), другой по событию позже. В примере применяются идентификаторы скриптов (... + this.ClientID)- на случай, если каждому контролу нужен свой скрипт. Если один скрипт может обслужить много контролов, то просто проверка есть ли такой(if(!this.Page.IsClientScriptBlockRegistered("LabelScript")))
Перевернув мир - оглянись, может перевернулся ты сам?!
voodoos
Дата: 24.04.2007 01:56:00
Регь скрипты через Page.ClientScript и проверяй перед регисрацией соотв. Is...Registered()


Есть в 2.0 возможность добавлять скрипты как ресурсы в ДЛЛ (вроде так). Я с этим правда не разобрался, бо небыло практической необходимости и/или вдохновения, но возможность интересная и полезная. Улыбка
Колекціонерові метеликів здається, що усі по вулиці із сачками ходять.
bmikle31
Дата: 24.04.2007 09:12:29
всем спасибо. это примерно то что мне нужно.
Идеальный вариант это скрипты в ресурсах, о которых писал voodoos, Если кто знает как их юзать напишите пожалуйста, я не осилил :(
Rock-n-Roll Live!!!
ksm
Дата: 24.04.2007 09:59:11
Всё просто. Добавляешь в проект к примеру JScript.js файл. Затем в AssemblyInfo.cs добавляешь следующую строку
[assembly: WebResource("ControlLibrary.JScript.js", "text/javascript", PerformSubstitution = true)]
Затем в своём котроле к примеру в OnInit(), добовляешь следующее
base.OnInit(e);
this.Page.ClientScript.RegisterClientScriptInclude(GetType(), "JSCRIPT_DEFAULT_KEY", Page.ClientScript.GetWebResourceUrl(GetType(), "ControlLibrary.JScript.js"));
А закон Мэрфи гласит: "Отсутствовать будут как раз те файлы, в которых вы больше всего нуждаетесь".
bmikle31
Дата: 24.04.2007 17:57:15
Всем спасибо, разобрался. Если кого-то еще интересует эта тема, тут есть инфа:
http://www.gotdotnet.ru/Forums/Web/202400.aspx
Rock-n-Roll Live!!!