2010-08-30 64 views
1

是否可以在运行时更改usercontrol使用的ascx文件?在运行时更改用户控件模板

举例来说,在我的网页我在web.config中有

<ctl:SampleControl runat="server" /> 

<controls> 
<add tagPrefix="ctl" tagName="SampleControl" src="~/UserControls/SampleControl.ascx" /> 
</controls> 

在运行时,我希望能够在ASCX改变到另一条路径,它会仍然继承相同的用户控件代码隐藏,它只是一个不同的模板。

回答

0

可能最好的办法是在你的web.config文件中不要编码“default”.ascx文件的文件名。它会让你的生活更加艰难。始终做到这一点决定在运行时,这样的例如:

在.aspx文件中:

<asp:PlaceHolder runat="server" ID="samplePH" /> 

在后台代码:

string file = "~/UserControls/SampleControl.ascx"; 
if (condition) 
    file = "~/UserControls/OtherControl.ascx"; 
UserControl uc = (UserControl)LoadControl(file); // from System.Web.UI.TemplateControl. 
samplePH.Controls.Clear(); 
samplePH.Controls.Add(uc); 

但是,请注意,为了使后备才能正常工作,您需要实例化在页面生命周期早期(通常是初始阶段)在最后一次请求中加载的相同控件。这将确保viewstate被正确解析。然后,进一步在事件处理程序,PreRender等生命周期步骤中,可以使用上面的代码为当前请求加载UserControl。

如果你真的需要编码在配置文件中的默认页面设置(其中,最终用户可能希望改变它的情况下),可以考虑在app.config做它,而不是在网络的<controls>部分掩埋掉的.config。

文档的TemplateControl.LoadControl(string)方法: http://msdn.microsoft.com/en-us/library/system.web.ui.templatecontrol.loadcontrol.aspx

+0

嗨沃伦,这是一个潜在的解决方案,但它有几个问题对我来说。首先,我真的不想将用户控件绑定到代码隐藏,最终我只想将它放入页面。 然后这带来了传递给用户控件的值的问题,如果我要使用属性,我可以弹出它的页面与”>但如果usercontrol隐藏在逻辑之后,那么不会可行。 – dnolan 2010-09-01 09:02:52