2011-07-20 49 views
3

我目前遇到問題,無法解決。我有一個名爲「Dashboard」的用戶控件,它具有以下標記,其中包含多個子控件。我遇到ASP .NET用戶控件問題

<%@ 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" /> 
<% } %> 

正如您所看到的,我希望它根據某些條件顯示一些控件或其他控件。但是,所有這些控件的「Load」事件都會被觸發,即使它們未被使用。

我該如何預防?

回答

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); 
} 
2

你完全可以裝載在一個特定的條件,而不是控制,所以要儘量設置visible/invisible與用戶控件,這是一個更好的方法

<% if (isAdministrator) 
{ %> 
Page.LoadControl(("~\Administrator1.ascx"); 
<% } 
0

有關使用MultiView控件如何線條的東西嗎? MultiView on MSDN

+0

我想'MultiView'仍然會加載所有的控件並且至少運行一些事件。 – R0MANARMY

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>