Asp.net: сбой условной загрузки пользовательских элементов управления - PullRequest
6 голосов
/ 29 апреля 2011

Привет (простите за плохой заголовок)

У меня есть пользовательский элемент управления, который загружает различные дополнительные пользовательские элементы управления в зависимости от следующих условий:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SubPage.ascx.cs" Inherits="SubPage" %>
<%@ Register Src="<srcA>" TagName="A" TagPrefix="CTRL" %>
<%@ Register Src=">srcB>" TagName="B" TagPrefix="CTRL" %>

<% if (someValue == 1) { %>
    Loading user control A..
    <CTRL:A runat="server" />
<% } else { %>
    Loading user control B..
    <CTRL:B runat="server" />
<% } %>

Результат будет выглядеть правильно; ожидаемый контент отображается. Но я заметил, что хотя someValue! = 1 и отображается элемент управления B, элемент управления A все еще загружается за сценой (вызывается загрузка страницы).

Почему это? И какой подход лучше? Благодаря.

Ответы [ 3 ]

2 голосов
/ 29 апреля 2011

Вам нужно вызвать LoadControl метод вместо

<% if (someValue == 1) { %>
Loading user control A..  

Page.LoadControl(("~\ExampleUserControl_A.ascx");

<% } else { %>
    Loading user control B..
    this.LoadControl(("~\ExampleUserControl_B.ascx");
<% } %>
2 голосов
/ 29 апреля 2011

Page_Load вызывается, потому что вы обрабатываете это событие.Не пытайтесь загружать их таким образом, а используйте вместо этого Visible-Property из codebehind.

Предоставьте открытую функцию, которую контроллер (в вашем случае SubPage.ascx) вызывает после изменения видимого состояния для загрузкисодержание UserControl.Элементы управления, которые не отображаются, вообще не будут отображаться как html.

Загрузка элементов управления динамически, если она вам действительно не нужна, может вызвать ненужные проблемы ViewState- или Event-Handling. Здесь - некоторые другие недостатки, упомянутые в отношении динамических пользовательских контролей.

0 голосов
/ 29 апреля 2011

Код спереди:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SubPage.ascx.cs" Inherits="SubPage" %>
<%@ Register Src="<srcA>" TagName="A" TagPrefix="CTRL" %>
<%@ Register Src="<srcB>" TagName="B" TagPrefix="CTRL" %>
<asp:placeholder id="plhControls" runat="server" />

Код сзади:

if (someValue == 1) { 
    CTRLA ctrlA = (CTRLA)LoadControl("~/Controls/ctrlA.ascx");
    plhControls.Controls.Add(ctrlA);
} else {
    CTRLB ctrlB = (CTRLB)LoadControl("~/Controls/ctrlB.ascx");
    plhControls.Controls.Add(ctrlB);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...