我目前有一个问题无法解决。我有一个名为“Dashboard”的用户控件,它有以下标记,包含几个子控件。
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Dashboard.ascx.cs" Inherits="BlueSEQ.Controls.Dashboard.Dashboard" %>
<%@ Register src="Administrator.ascx" tagname="Administrator" tagprefix="uc1" %>
<%@ Register src="Provider.ascx" tagname="Provider" tagprefix="uc2" %>
<%@ Register src="User.ascx" tagname="User" tagprefix="uc3" %>
<% if (isAdministrator)
{ %>
<uc1:Administrator ID="Administrator1" runat="server" />
<% }
else if (isProvider)
{ %>
<uc2:Provider ID="Provider1" runat="server" />
<% }
else
{ %>
<uc3:User ID="User1" runat="server" />
<% } %>
如您所见,我希望它根据某些条件显示一些控件或其他控件。但是,所有这些控件的“加载”事件都会被触发,即使它们未被使用。
我该如何防止这种情况?
答案 0 :(得分:5)
如果您可以提供帮助,请尽量避免在标记中使用条件逻辑。它可能使设计人员更难理解这些视图(如果您正在与设计人员合作),并且将来更难以找到并重构此代码。
您还应该看看ASP.NET MVC: Avoiding Tag Soup。虽然它是ASP.NET MVC,但它仍然是一个很好的例子,说明如何在视图中添加逻辑可以快速地使它们变得非常困难和令人不愉快(初始示例)。
您可以使用此处描述的技术:如何:Add Controls to an ASP.NET Web Page Programmatically。
您的标记看起来像这样。
<asp:PlaceHolder id="MyPlaceholder" />
并且您的代码隐藏将具有某些内容
private void InitSection()
{
Control c;
if( isAdministrator )
c = Page.LoadControl("~\Administrator.ascx")
else if( isProvider )
c = Page.LoadControl("~\Provider.ascx")
else
c = Page.LoadControl("~\User.ascx");
MyPlaceholder.Controlls.Add(c);
}
答案 1 :(得分:3)
执行此操作的理想方法是设置asp.net角色提供程序并使用LoginView控件,这与下面的代码一致。 LoginView仅加载适当的内容。
<asp:LoginView runat="server">
<AnonymousTemplate>
<uc1:User ID="User" runat="server" />
</AnonymousTemplate>
<RoleGroups>
<asp:RoleGroup Roles="Administrator">
<ContentTemplate>
<uc1:Administrator ID="Administrator1" runat="server" />
</ContentTemplate>
</asp:RoleGroup>
<asp:RoleGroup Roles="Provider">
<ContentTemplate>
<uc1:Provider ID="Provider" runat="server" />
</ContentTemplate>
</asp:RoleGroup>
</RoleGroups>
</asp:LoginView>
答案 2 :(得分:2)
您必须在特定条件下加载控件,因此请尝试使用usercontrol设置visible/invisible
,这是一种更好的方法
<% if (isAdministrator)
{ %>
Page.LoadControl(("~\Administrator1.ascx");
<% }
答案 3 :(得分:0)
使用MultiView控件怎么样? MultiView on MSDN