Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我对ASP.NET用户控件有问题_C#_.net_Asp.net_User Controls - Fatal编程技术网

C# 我对ASP.NET用户控件有问题

C# 我对ASP.NET用户控件有问题,c#,.net,asp.net,user-controls,C#,.net,Asp.net,User Controls,我目前有一个无法解决的问题。我有一个名为“Dashboard”的用户控件,它有以下标记,包含几个子控件 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Dashboard.ascx.cs" Inherits="BlueSEQ.Controls.Dashboard.Dashboard" %> <%@ Register src="Administrator.ascx" tagname="Administrat

我目前有一个无法解决的问题。我有一个名为“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" />
<% } %>

如您所见,我希望它根据某些条件显示一些控件或其他控件。然而,所有这些控件的“加载”事件都会被触发,即使它们没有被使用


如何防止这种情况发生?

您必须在特定条件下加载控件,因此尝试使用usercontrol设置
可见/不可见
,这是一种更好的方法

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

Page.LoadControl((“~\Administrator1.ascx”);

如果可以,请尽量避免在标记中使用条件逻辑。这可能会使设计人员(如果您与设计人员一起工作)更难理解视图,并且在将来更难找到和重构此代码

您还应该看看。虽然它是ASP.NET MVC,但它仍然是一个很好的例子,说明了向视图中添加逻辑会使视图很快变得很难维护且不易维护(初始示例)


您可以使用此处描述的技术:如何:

您的标记看起来像这样

<asp:PlaceHolder id="MyPlaceholder" />

使用多视图控件怎么样?
实现这一点的理想方法是设置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>

我认为
MultiView
仍将加载所有控件,并在其上运行至少部分事件。
<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>