Вопрос

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

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);
    }

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

Это было полезно?

Решение

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

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

  1. В вашем существующем решении добавьте новый проект управления сервером ASP.NET Server (щелкните правой кнопкой мыши на вашем решении из проводника решения -> Добавить новый проект -> Управление сервером ASP.NET). Назови это 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 контроль.

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

Использование директивы @ Регистрация:

Пойти к желаемому .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 Директива на каждой отдельной странице.

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

Другие советы

Вы можете создать класс (давайте назовем это foo), который вытекает из System.Web.ui.wage и абстрактный метод в точку, где он многоразован. Все ваши довольны должны выходить из FOO вместо System.Web.ui.page

Моя рекомендация будет либо использовать главную страницу, либо нарушать код в статическую функцию, которая принимает объект System.Web.ui.page в качестве параметра. Конечно, вы всегда можете использовать наследство (который будет работать), но вы потеряете возможность накладывать страницу с использованием функции времени проекта Drag-and-Drop, поскольку Designer WS.NET Web Form делает большую ушивку с страницами ASPX Не получите из System.Web.ui.page или System.web.ui.masterpage напрямую.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top