Я сталкиваюсь с той же проблемой. Проблема в том, что вам нужно добавить диспетчер сценариев до этапа OnInit - насколько я понимаю, это нужно сделать на этапе preinit. Вы можете увидеть это, добавив кучу переопределений - я обнаружил, что страница прошла через preinit ok, затем перешла к событию addedcontrol, и это было в (или сразу после, но этот момент имеет смысл), что «Вам нужен менеджер сценариев. "бросается. Я изо всех сил пытаюсь найти, как добавить обработчик событий к событию Page.PreInit из дочернего пользовательского элемента управления, поскольку WUC не имеют события PreInit. Даже конструктор WUC не срабатывает до этой точки, а в конструкторе объект страницы имеет значение NULL, поэтому вы не можете добавить его туда. Даже на этапе AddedControl WUC вы все еще не можете получить доступ к главной странице (ScriptManager oSCM = ScriptManager.GetCurrent (Page); возвращает null), поэтому вы не можете добавить диспетчер сценариев, если вы необходимо, прежде чем будет выдана ошибка.
/ edit: - Насколько я могу это видеть (и у меня не было ответа на это на форумах asp.net - сюрприз, сюрприз), WUC не начинает действовать в своих методах / событиях до тех пор, пока не пройдет стадия preinit родителя , так что есть 2 способа сделать это.
1) Как я думаю, я бы сделал это так, чтобы не помещать в конструктор какой-либо контент, который требует диспетчера сценариев, и помещать заполнители там, где это содержимое должно быть. Затем в загрузке wuc вы используете ScriptManager.GetCurrent, чтобы увидеть, есть ли он уже там, и затем создать его, если нет. Затем вы динамически добавляете контент, для которого требуется SCM. Что-то вроде этого:-
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="wucTestExample.ascx.cs" Inherits="wucTestExample" %>
<asp:PlaceHolder ID="plcAJAX" runat="server" />
<asp:Label ID="lblGeneral" runat="server" Text="This is another label" />
----------------code behind---------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class wucTestExample : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
ScriptManager oSCM = ScriptManager.GetCurrent(this.Page);
if (oSCM == null)
{
oSCM = new ScriptManager();
oSCM.ID = "scmAJAX";
oSCM.EnablePartialRendering = true;
this.plcAJAX.Controls.AddAt(0, oSCM);
}
UpdatePanel udpMain = new UpdatePanel();
udpMain.ID = "udpMain";
TextBox txtMain = new TextBox();
txtMain.ID = "txtMain";
// other attrbutes here
Button btnPostback = new Button();
btnPostback.ID = "btnPostback";
btnPostback.Click += new EventHandler(btnPostback_Click);
btnPostback.Text = "Partial Postback";
Label lblPostback = new Label();
lblPostback.ID = "lblPostback";
lblPostback.Text = "initial postback";
udpMain.ContentTemplateContainer.Controls.Add(txtMain);
udpMain.ContentTemplateContainer.Controls.Add(btnPostback);
udpMain.ContentTemplateContainer.Controls.Add(lblPostback);
this.plcAJAX.Controls.Add(udpMain);
}
void btnPostback_Click(object sender, EventArgs e)
{
// implement button code here
Label lblPostback = (Label)this.plcAJAX.FindControl("lblPostback");
if (lblPostback != null)
{
lblPostback.Text = String.Format("WUC POstback at : {0}", DateTime.Now.ToLongTimeString());
}
}
}
затем используйте это так: -
<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="TestExampleNoSCM.aspx.cs" Inherits="TestExampleNoSCM" %>
<%@ Register Src="~/wucTestExample.ascx" TagName="wucTestExample" TagPrefix="ucTE" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<%--<asp:ScriptManager ID="scmAJAX" runat="server" />--%>
<asp:Label ID="lblLoadTime" runat="server" />
<ucTE:wucTestExample ID="wucTestExample" runat="server" />
</asp:Content>
----------------code behind---------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class TestExampleNoSCM : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.lblLoadTime.Text = String.Format("Page load at: {0}",DateTime.Now.ToLongTimeString());
}
}
Поэтому, если вы прокомментируете или раскомментируете SCM на родительской странице, WUC все равно будет работать в любом случае.
2) Я видел другой вариант, когда требовалась панель обновления, и программист создал все элементы управления в дизайнере, а затем зациклил их при загрузке страницы (после создания SCM, если необходимо, и UDP и добавил все элементы управления на WUC UDP, прежде чем добавить это в заполнитель, но это кажется мне довольно опасным, поскольку кажется, что это двойное создание экземпляра элемента управления, и я думаю, что он может вернуться, чтобы укусить их за задницу ...
Обратной стороной метода 1 является то, что создание всего в вашей панели обновлений программным способом требует больше усилий, но если вы действительно хотите создать независимый WUC, это, похоже, ваша цена (и, надеюсь, WUC не должен быть таким сложным, так или иначе). Лично я думаю, что в своем приложении (поскольку WUC не будет использоваться вне его) я просто добавлю SCM там, где это необходимо, на главной странице.
Еще одно, последнее замечание, которое я хотел бы внести - я видел людей, говорящих «добавить его на главную страницу» - это кажется особенно плохой идеей, ИМХО, если только каждая страница в вашем приложении нужен SCM, поскольку он добавит совершенно новый уровень раздувания на ваши страницы, и это не кажется хорошей идеей, поскольку ASP.NET, похоже, уже имеет хороший уровень раздувания ...
person
Mad Halfling
schedule
29.07.2009