Здесь есть некоторые технически сложные части, и я попытаюсь рассказать о них здесь. Я провел некоторое время в Google, пока, наконец, не получил все кусочки. Я, конечно, не могу помочь вам со всеми из них. Некоторые из них очень локальны для реального сценария. Фактически, я никогда не находил подходящей информации для своего сценария, которая не привела бы меня к спагетти-коду, огромной базе кода и т. Д.
Вы создаете составной элемент управления, просто переопределяя System.Web.UI.Webcontrols.Webcontrol в новом классе. Я использую CombinedScript как имя из-за вашего интереса к нему. Имя, конечно, может быть любым.
public class CombinedScript : System.Web.UI.WebControls.WebControl
{
}
Хотя вы можете изменить это, у вас есть несколько методов для использования. Есть несколько методов, которые приведены ниже, но вы должны выбрать наиболее подходящий для вас вариант.
protected override void OnPreRender(EventArgs e)
{
}
protected override void Render(HtmlTextWriter writer)
{
}
Дело в том, что методы делают вещи до, во время и после генерации контента элементов управления для клиента. OnPreRender встречается раньше, т.е.
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
ClientScriptManager cs = this.Page.ClientScript;
cs.RegisterClientScriptResource(typeof(WebControls.CombinedScript), "Project.Script.Common.js");
cs.RegisterClientScriptResource(typeof(WebControls.CombinedScript), "Project.Script.JQuery.js");
cs.RegisterClientScriptResource(typeof(WebControls.CombinedScript), "Project.Script.JCharts.js");
}
Сложная вещь - это путь к сценариям. «Проект» - это базовое имя сборки DLL. «Скрипт» - это регистрозависимый путь, в котором находятся файлы скриптов (считая от базового пути проекта). Последняя часть - это имя файла с учетом регистра. Я не уверен, но я думаю, что уловка пути не вызывает сомнений, если вы оставите точное все в корне.
WebControls.CombinedScript - это, как вы можете видеть, имя элемента управления. Для использования на страницах ASP.NET он должен быть зарегистрирован в web.config.
<pages>
<controls>
<add assembly="Project" tagPrefix="myname" namespace="Project.WebControls" />
</controls>
</pages>
Эти RegisterClientScriptResource заставляют скрипты загружаться как GET /WebResource.axd?d=MTVCK_diZif7wEDQp9UGv-GlqPKP-WXGPNEqr-mq_RnUKWDgSydkLxIuSusdnolRQsR-wpNbTpfJzAVtsonjuwVUqzguotspQFImk6-auSF3N18eVOXbYh_-6NHovgR90&t
при загрузке сайта. Если нет, значит что-то не так. То есть неправильный путь, забыли включить JS в качестве встроенного ресурса и так далее.
Когда все вышеперечисленное выполнено, вы регистрируете DLL, добавляете тег namespace / control и затем помещаете его на свою страницу с помощью <myname:CombinedScript runat="server" />
Вероятно, вы можете сделать что-то вроде этого, добавить открытые свойства в Composite Control
public int ScriptType {get;set;}
. Поместите атрибут в элемент управления <myname:CombinedScript ScriptType="1" runat="server" />
. и добавьте if (this.ScriptType == 1) { ..evaluate what script to load.. }
. Конечно, этот тип оценки может быть изменен с клиентской стороны (любой может заменить сгенерированный html другим идентификатором ScriptType).
Думаю, вы сможете лучше исследовать себя. Вы хотите, чтобы операторы оценивали, какие скрипты загружать. Последний пример выше - один из способов, и вы, конечно, можете поместить любую логику между / в RegisterClientScriptResources.
Мне говорили о RenderControl и Render.
Вы можете использовать это так:
protected override void Render(HtmlTextWriter writer)
{
HttpResponseSubstitutionCallback callback = new HttpResponseSubstitutionCallback(outputcache_callback);
Context.Response.WriteSubstitution(callback);
}
public static string outputcache_callback(HttpContext context)
{
string html = "";
html += "<script type='text/javascript'>";
html += " var lang='" + Project.Common.CurrentLang + " ';";
html += " var applicationPath='" + GetApplicationPath + "'; ";
html += "</script>";
return html;
}
public GetApplicationPath { get { ..logic.. }}
Это еще одна техника, позволяющая помещать скрипты в клиентскую среду. Хорошо, если вы хотите, чтобы в ваши скрипты загружались переменные, специфичные для пользователя или экземпляра. static
для образца замещения. Кроме того, если вы хотите повлиять на создание содержимого самого элемента управления (например, если вы сделаете более умный asp: Label, вы можете сделать это,
public override void RenderControl(HtmlTextWriter writer)
{
base.RenderControl(writer);
writer.Write("<div id='dvBox'>");
....
base.RenderChildren(writer);
writer.Write("</div>");
writer.Write(script);
}
Я надеюсь, что это информация, которая объединяет и помогает нескольким разработчикам, ищущим такой способ создания элементов управления.