在运行时更改UserControl模板

时间:2010-08-30 08:38:41

标签: asp.net user-controls

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

例如在我的页面中我有

<ctl:SampleControl runat="server" />

在web.config中我有

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

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

1 个答案:

答案 0 :(得分: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);

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

如果您确实需要在配置文件中对默认页面设置进行编码(对于最终用户可能想要更改它的情况),请考虑在app.config中进行,而不是埋藏在{<controls>中。 1}} web.config的一部分。

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