Конечно, хитрость заключается в том, чтобы добавить его в обработчик события Init страницы. Вы можете использовать:
Page.Init += delegate {
// check for script manager
if( ScriptManager.GetCurrent(Page) == null ) {
ScriptManager m = new ScriptManager();
m.ScriptMode = ScriptMode.Release;
Page.Form.Controls.AddAt(0, m);
}
}
Я бы рекомендовал избегать динамического добавления форм на вашу страницу, если вы можете. Например, в приведенном выше фрагменте кода предполагается, что форма уже присутствует на странице.
Обновление
Конечно, спасибо, что указал на это Андреасу. Вот обновление. Таким образом, для Page.Form нет установщика, но вы правы в том, что вы можете добавить новый HtmlForm в коллекцию Controls. После добавления свойство Page.Form больше не равно нулю. Это позволит вам динамически добавлять ScriptManager, как показано выше. Вот пример кода, демонстрирующий эту работу (файл ASPX представляет собой простую страницу без серверной формы):
public partial class Pages_Test_DynamicFormSample : Page {
protected void Page_Init(object sender, EventArgs e) {
Controls.Add( new HtmlForm() );
ScriptManager m = new ScriptManager();
m.ScriptMode = ScriptMode.Release;
Form.Controls.AddAt(0, m);
}
protected void Page_Load(object sender, EventArgs e) {
// ScriptManager test
var t1 = new System.Web.UI.WebControls.TextBox();
var t2 = new System.Web.UI.WebControls.TextBox();
Form.Controls.Add( t1 );
Form.Controls.Add( t2 );
ScriptManager.GetCurrent(Page).SetFocus( t2 );
}
}
Наслаждайтесь - кстати, установка ScriptManager ScriptMode в Release, очевидно, не требуется. Мы делаем это только для того, чтобы избежать некоторых ошибок JavaScript, обнаруженных в версии Debug среды выполнения сценариев ASP.NET.