我有一个使用母版页的ASP.Net Web项目。 该母版页包含用户控件形式的菜单。 有时我想动态更改它以使用不同类型的菜单用户控件。
<%@ Register TagPrefix="chase" TagName="topMenu" Src="~/UserControls/TopMenu.ascx" %>
<div id="menuRow">
<chase:topMenu runat="server" />
</div>
无论如何,我可以动态更改注册码中的“SRC”属性以使用不同的用户控件吗?!
非常感谢
尝试此代码,但我收到'无效的转换异常'
TopMenu uh3 = (TopMenu)this.LoadControl("~/UserControls/TopMenu.ascx");
menuRow.Controls.Add(uh3);
'无法将类型为'ASP.usercontrols_topmenu_ascx'的对象强制转换为'SwintonTaxiWeb.UserControls.TopMenu'。'
答案 0 :(得分:1)
如果您在运行时添加用户控件,无论您需要什么,该怎么办。
UserControls_header3 uh3 = (UserControls_header3)this.LoadControl(header3);
phHeaderControls.Controls.Add(uh3);
答案 1 :(得分:0)
您是否尝试在页面上注册两个用户控件并相应地隐藏/禁用。
答案 2 :(得分:0)
是什么导致了动态变化?
您可以非常轻松地在服务器端代码中执行此操作。
在您的.aspx页面中,您可以:
<asp:Panel id="menuRow" runat="server">
</asp:Panel>
我在这里使用的是Panel,因为它为控件提供了一个很好的容器,并在它们周围输出<div>
标记。
然后在你的代码中,你会有类似的东西:
// Determine correct user control to load
string pathToUserControl = DetermineTopMenu();
// Load the user control - calling LoadControl forces the correct lifcycle events
// to fire, and ensures the control is created properly.
var topMenu = LoadControl(pathToUserControl);
// Add the control to the menuRow panels control collection.
menuRow.Controls.Add(topMenu);
我假设您有一些方法可以确定要显示哪个用户控件,并且您已经以这样的方式命名它们,即生成用户控件的路径非常简单。我在方法调用DetermineTopMenu
中隐藏了这个逻辑,因为:
有关LoadControl的更多信息,请查看documentation。
答案 3 :(得分:0)
关于InvalidCastException的问题,也许这个MSDN page会有所帮助。您可以尝试在控件的<%@ Control %>
标记中设置控件的类名。
答案 4 :(得分:0)
我希望你能从这个帖子中找到一些线索 - Dynamically Change User Control in ASP.Net
答案 5 :(得分:0)
如果使用输出缓存,则LoadControl将返回System.Web.UI.PartialCachingControl的实例。然后,您可以通过其属性CachedControl访问缓存实例,您必须将其强制转换为相应的UserControl派生类型。