Создание DLL из пользовательского элемента управления плюс Jquery, встроенный в - PullRequest
2 голосов
/ 05 марта 2012

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

Теперь я ищу для этого: Embed Jquery и plugin внутри a user control или composite control, например, с некоторыми labels or repeater, ... и сделать из него вывод DLL

элемент управления должен обеспечить проверку приоритетов сценариев Сначала Jquery, а затемplugin

Наконец-то можно сделать из него повторно используемую DLL

заранее спасибо

Редактировать: путь, лучшие практики, информация илиценится простой пример его самых сложных деталей, пожалуйста, посмотрите на мой комментарий ниже

1 Ответ

1 голос
/ 09 марта 2012

Здесь есть некоторые технически сложные части, и я попытаюсь рассказать о них здесь.Я провел некоторое время в 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);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...