У меня проблема с пользовательскими элементами управления ASP .NET - PullRequest
3 голосов
/ 20 июля 2011

У меня есть проблема, которую я не могу решить.У меня есть пользовательский элемент управления «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" />
<% } %>

Как вы можете видеть, я хочу, чтобы он отображал некоторые элементы управления или другие элементы управления в зависимости от некоторых условий.Тем не менее, все эти элементы управления «Загрузка» события запускаются, даже если они не используются.

Как я могу предотвратить это?

Ответы [ 4 ]

5 голосов
/ 20 июля 2011

Если вы можете помочь, постарайтесь не использовать условную логику в разметке. Это может усложнить понимание представлений для дизайнеров (если вы работаете с дизайнерами) и затруднить поиск и реорганизацию этого кода в будущем.

Вам также следует взглянуть на ASP.NET MVC: Избежание супа тегов . Хотя это ASP.NET MVC, он по-прежнему является хорошим примером того, как добавление логики в ваши представления может быстро сделать их очень трудными и неприятными для обслуживания (начальный пример).


Вы можете использовать метод, описанный здесь: Как: Программно добавлять элементы управления на веб-страницу ASP.NET .

Ваша разметка будет выглядеть примерно так.

<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);
}
3 голосов
/ 20 июля 2011

Идеальный способ сделать это - настроить поставщика ролей 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 голосов
/ 20 июля 2011

Вместо этого вы должны загрузить элемент управления в определенном состоянии, поэтому попробуйте установить visible/invisible с помощью usercontrol, это гораздо лучший подход

<% if (isAdministrator)
{ %>
Page.LoadControl(("~\Administrator1.ascx");
<% }
0 голосов
/ 20 июля 2011

Как насчет использования элемента управления MultiView? MultiView на MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...