У меня такая же проблема. Проблема в том, что вам нужно добавить скрипт-менеджер перед этапом OnInit - насколько я вижу, это нужно сделать на этапе preinit. Вы можете увидеть это, добавив множество переопределений - я обнаружил, что страница прошла через preinit, все в порядке, затем перешел к событию addcontrol, и было (или сразу после него, но этот момент имеет смысл), что «Вам нужен менеджер сценариев» "брошен. Я изо всех сил пытаюсь найти, как добавить обработчик события к событию Page.PreInit от дочернего usercontrol, поскольку у WUC нет события PreInit. Даже конструктор WUC не срабатывает до этой точки, и в конструкторе объект страницы имеет значение null, поэтому вы не можете добавить его туда. Даже на этапе AddedControl WUC вы все еще не можете получить доступ к главной странице (ScriptManager oSCM = ScriptManager.GetCurrent (Page); возвращает ноль), поэтому вы не можете добавить скрипт-менеджер, если вы надо, до того как ошибка выдаётся.
/ редактировать: -
Насколько я понимаю (а я не получил ответа на это на форумах 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, похоже, уже имеет хороший уровень раздувания ...