一个内容区域中的ASP.NET控件需要引用另一个内容区域中的控件

时间:2010-06-03 20:24:44

标签: asp.net master-pages

我有一个母版页,将主要内容分为两个区域。主页的主体部分有两个asp:ContentPlaceHolder控件,分别带有ID cphMain和cphSideBar。

其中一个相应的内容页面在cphMain中有一个控件需要引用cphSideBar中的控件。具体来说,cphMain中的SqlDataSource引用cphSideBar中的TextBox以用作select命令中的参数。当内容页面加载时,会发生以下运行时错误:

Could not find control 'TextBox1' in ControlParameter 'date_con'. 
Description: An unhandled exception occurred during the execution of the 
current web request. Please review the stack trace for more information about 
the error and where it originated in the code. 
Exception Details: System.InvalidOperationException: Could not find control
'TextBox1' in ControlParameter 'date_con'.
Source Error: An unhandled exception was generated during the execution of the
current web request. Information regarding the origin and location of the
exception can be identified using the exception stack trace below.  
Stack Trace: 
[InvalidOperationException: Could not find control 'TextBox1' in ControlParameter 'date_con'.]
    System.Web.UI.WebControls.ControlParameter.Evaluate(HttpContext context, Control control) +1753150
    System.Web.UI.WebControls.Parameter.UpdateValue(HttpContext context, Control control) +47
    System.Web.UI.WebControls.ParameterCollection.UpdateValues(HttpContext context, Control control) +114
    System.Web.UI.WebControls.SqlDataSource.LoadCompleteEventHandler(Object sender, EventArgs e) +43
    System.EventHandler.Invoke(Object sender, EventArgs e) +0
    System.Web.UI.Page.OnLoadComplete(EventArgs e) +8698566
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +735

我知道问题是什么... ASP.NET不喜欢SqlDataSource和TextBox在内容页面中的不同asp:Content控件中的事实。

作为一种解决方法,我在cphMain中有另一个TextBox,其中SqlDataSource的Visible = False。然后在Page_Load()事件处理程序中,cphSideBar中TextBox的内容被复制到cphMain中不可见TextBox的内容中。

我得到了我想要的结果我想出的工作,但它似乎是这样的黑客。我想知道是否有一个我错过的更好的解决方案。

请告知。

1 个答案:

答案 0 :(得分:0)

我认为您需要使用其容器引用控件。

例如,获取对ContentPlaceHolder

的引用
ContentPlaceHolder myContent = (ContentPlaceHolder)this.Master.FindControl("MyContent");

其中MyContentContentPlaceHolderID,而不是ID的{​​{1}}:

ContentPlaceHolder

然后,您可以使用FindControl <asp:Content ContentPlaceHolderID="MyContent" ID="wrongID" runat="server"> 容器中找到子控件:

MyContent