ASP.NET动态更改用户控件源

时间:2009-10-15 09:19:11

标签: c# .net asp.net visual-studio user-controls

情景

我有一个使用母版页的ASP.Net Web项目。 该母版页包含用户控件形式的菜单。 有时我想动态更改它以使用不同类型的菜单用户控件。

注册用户控件的当前代码

<%@ Register TagPrefix="chase" TagName="topMenu"  Src="~/UserControls/TopMenu.ascx" %>

在body标签内

 <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'。'

6 个答案:

答案 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中隐藏了这个逻辑,因为:

  1. 我不知道你正在使用什么逻辑
  2. 它使测试,扩展等更容易。
  3. 有关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派生类型。