黑马程序员_同一页面使用用多次同一用户控件

本文探讨了在ASP.NET中为用户控件注册JavaScript方法时遇到的问题,特别是当页面多次包含同一控件时如何避免JS方法重复注册及冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“----------ASP.Net+Android+IOS开发、Net培训、期待与您交流!----------”

开发asp.net控件的时候,有时候需要为控件定义javascript方法,当页面加载该控件的时候,javascript方法也会一同被加载。但是这样有可能会产生一个问题,当页面中只包含该控件一次,那么不会产生问题,但是如果包含该控件多次,则可能产生javascript方法的调用问题。举一个例子,如下:

定一个控件:userControl.ascx,该控件的作用就是当选中checkbox时,会显示div中的"Hello!",反之则隐藏。

1.新建一个用户控件webUserControl.ascx

 前端

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="webUserControl.ascx.cs" Inherits="UserControls_webUserControl" %>
<asp:CheckBox runat="server" ID="checkBox1" Text="ShowHello" />
<div id="divShow" style="display:none;" runat="server">
Hello!
</div>

后端

  protected void Page_Load(object sender, EventArgs e)
    {

        /*
         无需检查以前是否已经注册过了
         客户端脚本由它的键和类型唯一标识。具有相同的键和类型的脚本被视为重复脚本。只有使用给定的类型和键对的脚本才能使用该页面进行注册。试图注册一个已经注册的脚本不会创建重复的脚本。
         很明白的
         如果你
         RegisterClientScriptBlock(this.getType(),"myjs","脚本内容");
         两次执行该代码,并不会输出两次脚本
         因为两次执行时this.getType()和"myjs"是没有改变的
        */
        string script = "<script src='js/JScript.js'></script>";//路径???(有待解决)
        Page.ClientScript.RegisterStartupScript(this.GetType(), "myjs", script);

        string ckb = this.ClientID + "_checkBox1";
        string div = this.ClientID + "_divShow";
        checkBox1.Attributes.Add("onclick", "showDiv('"+ckb+"','"+div+"')");
    }

新建一个js文件

function showDiv(ckb, div) {
    var checkBox = document.getElementById(ckb);
    var div = document.getElementById(div);
    if (checkBox.checked == true) {
        div.style.display = "";
    }
    else {
        div.style.display = "none";
     }
 }

新建一个aspx页面用于测试

<body>
    <form id="form1" runat="server">
    <div>
   <p> <uc:webUserControl runat="server" id="ucwebUserControl"></uc:webUserControl></p>
   <p> <uc:webUserControl runat="server" id="WebUserControl1"></uc:webUserControl></p>
   
    </div>
    </form>
</body>


执行结果:




场景:在自定义控件用户控件页面、后台代码都会有引用JS的可能,这就会出现混乱或者重复引用的可能。 一个自定义控件,用于在ASPX页面中注册JS: public class Script : Control {   #region 属性   private string m_Src;   ///    /// 脚本文件路径   ///    public string Src   {     get { return m_Src; }     set { m_Src = value; }   }   #endregion   ///    /// 在控件Init的时候将JS路径添加到HttpContext.Current.Items["IncludedJavaScript"]中。   ///    ///    protected override void OnInit(EventArgs e)   {     base.OnInit(e);     if (!string.IsNullOrEmpty(Src))     {       string src = ResolveUrl(Src);       List includedJs = HttpContext.Current.Items["IncludedJavaScript"] as List;       if (null == includedJs)       {         includedJs = new List();         HttpContext.Current.Items["IncludedJavaScript"] = includedJs;       }       if (!includedJs.Contains(src))       {         includedJs.Add(src);       }     }   } } 一个静态类,用于管理JS和在后台代码(cs文件)中注册JS: ///  /// Javascript管理器 ///  public static class JavaScriptManager {   ///    /// 包含JS引用。   ///    ///    public static void Include(params string[] filePaths)   {     HttpContext context = HttpContext.Current;     if (null == context)     {       throw new Exception("HttpContext为空。");     }     System.Web.UI.Page p = context.CurrentHandler as System.Web.UI.Page;     if (null == p)     {       throw new Exception("HttpContext.CurrentHandler不是Page。");     }     IList jss = GetIncludedJavaScript();     string resolveUrl;     foreach (string filePath in filePaths)     {       resolveUrl=p.ResolveUrl(filePath);       if (!jss.Contains(resolveUrl))       {         jss.Add(p.ResolveUrl(resolveUrl));       }     }   }   ///    /// 获取已经包含的JS列表   ///    ///    public static IList GetIncludedJavaScript()   {     HttpContext context = HttpContext.Current;     if (null == context)     {       throw new Exception("HttpContext为空。");     }     IList jss = HttpContext.Current.Items["IncludedJavaScript"] as IList;     if (null == jss)     {       jss = new List();       HttpContext.Current.Items["IncludedJavaScript"] = jss;     }     return jss;   } } 然后写一个基类页面,所有的页面都要继承自这个基类页: public class BasePage : System.Web.UI.Page {   public BasePage() { }   #region 注册/管理JS引用   ///    /// 将引用的JS添加到Page.Head中。   ///    private void InitJS()   {     IList includedJs = JavaScriptManager.JavaScriptManager.GetIncludedJavaScript();     foreach (string jsFilePath in includedJs)     {       var script = new HtmlGenericControl("script");       script.Attributes["type"] = "text/javascript";       script.Attributes["src"] = jsFilePath;       Page.Header.Controls.Add(script);     }   }   ///    /// 在呈现之前注册JS   ///    ///    protected override void OnPreRender(EventArgs e)   {     base.OnPreRender(e);     InitJS();   }   #endregion } 上面是在OnPreRender中将JS注册到Page.Head中的,所以如果在自定义控件中注册JS引用,请在OnPreRender之前引用。 在ASPX页面中注册JS:                                  在CS页面中注册JS: public partial class _Default : BasePage {   protected void Page_Load(object sender, EventArgs e)   {     JavaScriptManager.JavaScriptManager.Include("~/JS/cs.js",       "~/JS/cs.js",       "~/JS/cs.js2",       "~/JS/cs.js");   } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值