是否可以在运行时更改usercontrol使用的ascx文件?
例如在我的页面中我有
<ctl:SampleControl runat="server" />
在web.config中我有
<controls>
<add tagPrefix="ctl" tagName="SampleControl" src="~/UserControls/SampleControl.ascx" />
</controls>
在运行时我希望能够将ascx更改为另一个路径,它仍将继承相同的usercontrol代码隐藏,它只是一个不同的模板。
答案 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