代码之家  ›  专栏  ›  技术社区  ›  ACP

中的可重用页面预呈现函数asp.net

  •  0
  • ACP  · 技术社区  · 14 年前

    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 回复  |  直到 11 年前
        1
  •  3
  •   Community Egal    7 年前

    最干净的方法是使用从 LinkButton . 事实上,这似乎符合 the blog post 从你的 earlier question . 你只需要重写 OnPreRender lbHello.ClientID this.ClientID 引用该控件的特定实例。设置此项不应超过10分钟。完成后,您可以在一个页面上使用任意数量的控件,并在应用程序的各个页面中轻松支持它。

    当您按照我下面的说明,特别是“创建服务器控件”部分操作时,您可能会发现这篇MSDN文章很有帮助: Walkthrough: Developing and Using a Custom Web Server Control . 以下是实现这一目标的分步指南:

    1. LinkButtonDefault (当然,您可以随意更改名称)。
    2. 重命名 ServerControl1.cs LinkButtonDefault.cs
    3. 将文件中的命名空间重命名为 CustomControls
    4. 通过打开 AssemblyInfo.cs Properties 项目的文件夹)。在文件底部添加此行: [assembly: TagPrefix("CustomControls", "CC")]
    5. 添加此代码以覆盖 事件:

    代码(注意使用

        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}: 使用 链接按钮默认值 而不是 ServerControl1 . 新的服务器控制项目就是这样。我强烈建议您阅读前面提到的MSDN文章,以利用其他功能,例如在需要时向工具箱添加控件。

    完成这些步骤后,您应该有一个 类似于以下内容的文件:

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

    现在返回到您的web应用程序并添加对 项目。您应该能够从Add引用的 Project 选项卡,因为我建议将上述项目添加到现有解决方案中。如果您想在上面的项目中构建自己的解决方案,那么您可以添加对它的 .dll 使用 Browse 链接按钮默认值 控制。

    使用@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 web应用程序的文件。
    3. 找到 <system.web>...</system.web>

    映射:

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

    每个页面上的指令。

    如果你遇到困难,有任何问题请告诉我。请仔细阅读以上所有内容,因为这是一篇很长的文章,有很多代码。

        2
  •  0
  •   citronas    14 年前

    您可以创建一个从系统.Web.UI.Page并将方法抽象到可重用的程度。所有内容页都应该从Foo派生,而不是从系统.Web.UI.第页

        3
  •  0
  •   Javert93    14 年前

    我的建议是要么使用母版页,要么将代码分解为一个静态函数,该函数采用系统.Web.UI.Page对象作为参数。当然,您可以始终使用继承(这将起作用),但是您将失去使用拖放设计时功能来布局页面的能力,因为与.NETweb窗体设计器对不是源于系统.Web.UI.页或系统.Web.UI。直接创建母版页。