Asp.net 在运行时更改UserControl模板

Asp.net 在运行时更改UserControl模板,asp.net,user-controls,Asp.net,User Controls,是否可以在运行时更改usercontrol使用的ascx文件 例如,在我的页面中,我有 <ctl:SampleControl runat="server" /> 在web.config中,我有 <controls> <add tagPrefix="ctl" tagName="SampleControl" src="~/UserControls/SampleControl.ascx" /> </controls> 在运行时,我希望能够将a

是否可以在运行时更改usercontrol使用的ascx文件

例如,在我的页面中,我有

<ctl:SampleControl runat="server" />

在web.config中,我有

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


在运行时,我希望能够将ascx更改为另一个路径,它仍然是从相同的usercontrol codebehind继承的,它只是一个不同的模板。

这里最好的做法可能是不要在web.config中对“default”.ascx文件名进行编码。这会让你的生活更艰难。始终在运行时执行该确定,例如:

在.aspx文件中:

<asp:PlaceHolder runat="server" ID="samplePH" />
但是,请注意,为了使回发正常工作,您需要在页面生命周期的早期实例化上次请求中加载的同一个控件,通常是Init阶段。这将确保正确解析viewstate。然后,在事件处理程序、预渲染等生命周期步骤中,可以使用上述代码为当前请求加载UserControl

如果您确实需要在配置文件中对默认页面设置进行编码(对于最终用户可能想要更改它的情况),请考虑在<代码> App.CONFIG<代码>中执行,而不是将其隐藏在Web.CONFIG.

TemplateControl.LoadControl(string)
方法的文档:

你好,沃伦,这是一个潜在的解决方案,但对我来说有一些问题。首先,我真的不想将usercontrol与codebehind绑定,最终我只想将它放到页面中。这就带来了向usercontrol传递值的问题,如果我使用属性,我可以在页面中弹出它,但是如果usercontrol隐藏在逻辑后面,那么这将是不可行的。
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);