Многоразовая функция Page_PreRender в asp.net - PullRequest
0 голосов
/ 04 сентября 2010

У меня есть функция, которая устанавливает кнопку ссылки в качестве кнопки по умолчанию для панели.

protected void Page_PreRender(object sender, EventArgs e)
    {
        string addClickFunctionScript = @"function addClickFunction(id) {
               var b = document.getElementById(id);
               if (b && typeof(b.click) == 'undefined')
                 b.click = function() {
                   var result = true;
                   if (b.onclick) result = b.onclick();
                   if (typeof(result) == 'undefined' || result)
                     eval(b.getAttribute('href'));
                 }
             };";

        string clickScript = String.Format("addClickFunction('{0}');", lbHello.ClientID);

        Page.ClientScript.RegisterStartupScript(this.GetType(), "addClickFunctionScript", addClickFunctionScript, true);
        Page.ClientScript.RegisterStartupScript(this.GetType(), "click_" + lbHello.ClientID, clickScript, true);
    }

Это отлично работает. Как сделать это многоразовым на всех моих страницах моего приложения. На одной странице может быть несколько кнопок ссылок и несколько панелей .... Любое предложение ...

Ответы [ 3 ]

3 голосов
/ 06 сентября 2010

Самый простой способ - использовать пользовательский серверный элемент управления, который наследуется от LinkButton. На самом деле это похоже на сообщение в блоге из вашего предыдущего вопроса . Все, что вам нужно сделать, это переопределить событие OnPreRender и вставить код, который вы имеете при изменении lbHello.ClientID на this.ClientID, чтобы ссылаться на конкретный экземпляр этого элемента управления. Это не должно занять более 10 минут. После этого вы можете использовать столько элементов управления, сколько хотите, на одной странице и легко поддерживать их на разных страницах вашего приложения.

Эта статья MSDN может оказаться полезной при выполнении следующих моих инструкций, в частности, в разделе «Создание элемента управления сервером»: Пошаговое руководство. Разработка и использование пользовательского элемента управления веб-сервера . Вот пошаговое руководство для достижения этой цели:

  1. В существующее решение добавьте новый проект ASP.NET Server Control (щелкните правой кнопкой мыши свое решение в обозревателе решений -> Добавить новый проект -> ASP.NET Server Control). Назовите его LinkButtonDefault (вы, конечно, можете сменить имя).
  2. Переименовать ServerControl1.cs в LinkButtonDefault.cs
  3. Переименовать пространство имен в файле в CustomControls
  4. Выполните шаги 12-14 в статье MSDN, открыв файл AssemblyInfo.cs (содержится в папке Properties проекта). Добавьте эту строку внизу файла: [assembly: TagPrefix("CustomControls", "CC")]
  5. В LinkButtonDefault.cs добавить этот код для переопределения события OnPreRender:

Код (обратите внимание на использование this.ClientID):

    protected override void OnPreRender(EventArgs e)
    {
        string addClickFunctionScript = @"function addClickFunction(id) {
           var b = document.getElementById(id);
           if (b && typeof(b.click) == 'undefined')
             b.click = function() {
               var result = true;
               if (b.onclick) result = b.onclick();
               if (typeof(result) == 'undefined' || result)
                 eval(b.getAttribute('href'));
             }
         };";

        string clickScript = String.Format("addClickFunction('{0}');", this.ClientID);

        Page.ClientScript.RegisterStartupScript(this.GetType(), "addClickFunctionScript", addClickFunctionScript, true);
        Page.ClientScript.RegisterStartupScript(this.GetType(), "click_" + this.ClientID, clickScript, true);

        base.OnPreRender(e);
    }

Вы также можете обновить сгенерированный код атрибута над объявлением класса, которое начинается с [ToolboxData("<{0}:, чтобы использовать LinkButtonDefault вместо ServerControl1. Вот и все для нового проекта управления сервером. Я настоятельно рекомендую прочитать вышеупомянутую статью MSDN, чтобы воспользоваться другими возможностями, такими как добавление элементов управления на панель инструментов, если вам это необходимо.

После выполнения этих шагов у вас должен быть LinkButtonDefault.cs файл, похожий на этот:

using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomControls
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:LinkButtonDefault runat=server></{0}:LinkButtonDefault>")]
    public class LinkButtonDefault : LinkButton
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? "[" + this.ID + "]" : s);
            }

            set
            {
                ViewState["Text"] = value;
            }
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write(Text);
        }

        protected override void OnPreRender(EventArgs e)
        {
            string addClickFunctionScript = @"function addClickFunction(id) {
               var b = document.getElementById(id);
               if (b && typeof(b.click) == 'undefined')
                 b.click = function() {
                   var result = true;
                   if (b.onclick) result = b.onclick();
                   if (typeof(result) == 'undefined' || result)
                     eval(b.getAttribute('href'));
                 }
             };";

            string clickScript = String.Format("addClickFunction('{0}');", this.ClientID);

            Page.ClientScript.RegisterStartupScript(this.GetType(), "addClickFunctionScript", addClickFunctionScript, true);
            Page.ClientScript.RegisterStartupScript(this.GetType(), "click_" + this.ClientID, clickScript, true);

            base.OnPreRender(e);
        }
    }
}

Теперь вернитесь в свое веб-приложение и добавьте ссылку на проект CustomControls. Вы должны быть в состоянии сделать это на вкладке «Добавить ссылку» Project, поскольку я предложил добавить вышеупомянутый проект в существующее решение. Если вы хотите, чтобы вы могли построить вышеупомянутый проект в его собственном решении, то вы бы добавили ссылку на его файл .dll, используя вкладку Browse. После добавления ссылки вы готовы использовать новый элемент управления LinkButtonDefault.

Чтобы использовать элементы управления, вы можете использовать директиву @ Register на каждой странице, на которой будет использоваться элемент управления, или вы можете добавить его в файл Web.config и получить легкую ссылку на него в приложении. Я покажу вам оба метода ниже. Исходя из вашего вопроса, я думаю, вы захотите добавить его в Web.config. Обратитесь к статье MSDN, и вы найдете эту информацию в середине раздела «Префикс тега».

Использование директивы @ Register:

Перейдите на нужную страницу .aspx и добавьте директиву Register вверху каждой страницы, в которой вы хотите использовать элемент управления:

<%@ Register Assembly="CustomControls" Namespace="CustomControls" TagPrefix="CC" %>

На одной странице теперь вы можете использовать несколько экземпляров элемента управления. Вот пример:

<p><strong>1st Panel:</strong></p>
<asp:Label runat="server" ID="helloLabel" />
<asp:Panel ID="Panel1" runat="server" DefaultButton="lbHello">
    First name:
    <asp:TextBox runat="server" ID="txtFirstName" />
    <CC:LinkButtonDefault ID="lbHello" runat="server" Text="Click me" OnClick="lbHello_Click"
        OnClientClick="alert('Hello, World!');" />
</asp:Panel>

<p><strong>2nd Panel:</strong></p>
<asp:Label runat="server" ID="fooBarLabel" />
<asp:Panel ID="Panel2" runat="server" DefaultButton="lbFooBar">
    Other:
    <asp:TextBox runat="server" ID="TextBox1" />
    <CC:LinkButtonDefault ID="lbFooBar" runat="server" Text="Click me" OnClick="lbFooBar_Click" />
</asp:Panel>

В коде (.aspx.cs) вам нужно добавить:

protected void Page_Load(object sender, EventArgs e)
{
    // example of adding onClick programmatically
    lbFooBar.Attributes.Add("onClick", "alert('Foo Bar!');"); 
}

protected void lbHello_Click(object sender, EventArgs e)
{
    helloLabel.Text = String.Format("Hello, {0}", txtFirstName.Text);
}

protected void lbFooBar_Click(object sender, EventArgs e)
{
    fooBarLabel.Text = String.Format("FooBar: {0}", TextBox1.Text);
}

Использование Web.config:

Чтобы использовать Web.config, сохраните ту же разметку и код, которые использовались в приведенном выше примере. Выполните следующие действия:

  1. Удалите директиву @ Register, используемую в разметке .aspx.
  2. Откройте файл Web.config для вашего веб-приложения.
  3. Найдите раздел <system.web>...</system.web>.
  4. Добавьте следующее сопоставление в этот раздел:

Отображение:

<pages>
  <controls>
    <add assembly="CustomControls" namespace="CustomControls" tagPrefix="CC" />
  </controls>
</pages>

Перекомпилируйте и все должно успешно сработать. После этого вам больше не нужно указывать директиву @ Register на каждой отдельной странице.

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

0 голосов
/ 04 сентября 2010

Я бы порекомендовал либо использовать главную страницу, либо разбить код на статическую функцию, которая принимает объект System.Web.UI.Page в качестве параметра.Конечно, вы всегда можете использовать наследование (что сработает), но вы потеряете возможность макетировать свою страницу, используя функциональность времени перетаскивания, так как дизайнер веб-форм VS.NET сильно страдает от ASPX-страниц, которыене производные от System.Web.UI.Page или System.Web.UI.MasterPage напрямую.

0 голосов
/ 04 сентября 2010

Вы можете создать класс (назовем его Foo), производный от System.Web.UI.Page, и абстрагировать ваш метод до точки, где он будет использоваться повторно. Все ваши ContentPages должны происходить из Foo вместо System.Web.UI.Page

...