【问题标题】:ASP.NET Dynamically Change User Control SourceASP.NET 动态更改用户控件源
【发布时间】:2009-10-15 09:19:10
【问题描述】:

情景

我有一个使用母版页的 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'类型。'

【问题讨论】:

  • 你必须投射你加载的控件吗?为什么不只是:menuRow.Controls.Add(this.LoadControl("~/UserControls/TopMenu.ascx"));

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


【解决方案1】:

如果您在运行时根据需要添加用户控件会怎样。

UserControls_header3 uh3 = (UserControls_header3)this.LoadControl(header3);
phHeaderControls.Controls.Add(uh3);

【讨论】:

  • 请看我上面的编辑。每当我尝试这段代码时,我都会得到一个无效的强制转换异常:-(
【解决方案2】:

您是否可以尝试在页面上注册两个用户控件并相应地隐藏/禁用。

【讨论】:

  • 有点尝试过,它适用于其他一些控件,但这是一个由其他人构建的网络项目,我正在修改,我无法获得通常的工作方式。 ...
  • 无论哪种方式,我很确定您不能在运行时更改寄存器信息,否则为时已​​晚。我认为您需要查看两者都已注册但仅使用一个的场景。
  • 就像我说的那样,我非常喜欢您提到的方法,这就是我最初为其他一些修改所做的方式,但是对于某些人来说,我无法使用相同的方法来处理这个特定的控件原因。它的设计非常糟糕,代码混乱等。
【解决方案3】:

是什么导致了动态变化?

你可以很容易地在服务器端代码中做到这一点。

在您的 .aspx 页面中,您可以:

<asp:Panel id="menuRow" runat="server">
</asp:Panel>

我在这里使用 Panel 是因为它为我们提供了一个很好的控件容器,并在它们周围输出一个 &lt;div&gt; 标记。

然后在你的代码后面,你会有类似的东西:

// 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. 它使测试、扩展等变得更加容易。

有关 LoadControl 的更多信息,请查看documentation

【讨论】:

  • 'DetermineTopMenu();'是你写的自定义方法不是吗?
  • DetermineTopMenu 将是您必须编写的自定义方法,是的。这就是为什么我首先问“是什么导致了动态变化” - 大概你有一些方法可以确定要显示哪个用户控件,我只是建议你将它包装在一个单独的方法中。
【解决方案4】:

关于您关于 InvalidCastException 的问题,也许这个MSDN page 会有所帮助。您可以尝试在控件的&lt;%@ Control %&gt;标签中设置控件的类名。

【讨论】:

    【解决方案5】:

    我希望你能从这个帖子中找到一些线索 - Dynamically Change User Control in ASP.Net

    【讨论】:

      【解决方案6】:

      如果您正在使用输出缓存,则 LoadControl 返回 System.Web.UI.PartialCachingControl 的实例。然后,您可以通过其属性 CachedControl 访问缓存的实例,您必须将其转换为适当的 UserControl 派生类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 2013-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多