Как объединить скрипты, такие как JS и тому подобное, в UserControl и оценить / загрузить на страницах ASP.NET - PullRequest
0 голосов
/ 05 марта 2012

Однажды я потратил часы и дни, чтобы найти простой и удобный способ создания WebControl, который может обрабатывать загрузку скриптов.На основании параметров на стороне сервера (например, вошел пользователь в систему или нет), элемент управления может принять решение о загрузке сценария на клиент или нет.

Мы называем это CombinedScripts.

Вчера я комментировал вопрос по этой теме.К сожалению, хотя я написал ответ на это сегодня утром, он был удален оператором.Я опоздал на 12 минут, сказал ошибка-ответ.Теперь я пытаюсь переформулировать вопрос здесь, выслушать вашу (аудиторию), а также изложить свой ответ в течение следующих 15 минут в этом вопросе. Конечно, я могу свободно отвечать и давать идеи, я приму отметкуОтвет лучше всего подходит, если кто-то сделал что-то лучше, чем мой.

Google говорит очень много о том, как заставить такие вещи работать.Похоже, что на этом пути есть множество хитростей.Путь к сценарию, поведение, когда он не работает (потому что его легко скомпилировать).Также есть настройка web.config для регистрации компонента в проекте.Вопрос в том, чтобы попытаться сделать элемент управления как можно более автономным, встроить ресурсы и перенести элемент управления в другой проект для повторного использования.

1 Ответ

1 голос
/ 05 марта 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, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...