Здесь есть некоторые технически сложные части, и я попытаюсь рассказать о них здесь.Я провел некоторое время в 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);
}
Я надеюсь, что эта информация объединяет и помогаетНесколько разработчиков ищут такой способ создания элементов управления.