Получение менеджера сценариев на динамически отображаемой странице - PullRequest
3 голосов
/ 13 апреля 2010

Мы визуализируем пользовательские элементы управления динамически, как это:

public string RenderControl(string pathcontrol)
{
    string html;

    var page = new Page();
    var control = page.LoadControl(path);            
    page.Controls.Add(control);

    // do stuff to the control (give it some data to work on)

    using (var writer = new StringWriter())
    {
        HttpContext.Current.Server.Execute(page, writer, false);
        html = writer.ToString();
    }

    return html;
}

Это позволяет нам использовать те же пользовательские элементы управления при обычном отображении страниц, что и при отображении ответов на вызовы ajax. Однако при добавлении элементов управления, которые сами содержат scriptmanagerProxy, мы сталкиваемся с проблемой, заключающейся в том, что обновленный объект Page не содержит ни ScriptManager, ни HtmlForm, в котором должен работать ScriptManager.

Есть ли способ обойти это?

Yours Andreas

Ответы [ 3 ]

4 голосов
/ 01 мая 2010

Как уже говорили другие, вы можете добавить ScriptManger достаточно просто динамически [ Добавить ScriptManager на страницу программно? , если ваш Page объект завершен.

Можете ли вы попробовать использовать BuildManager.CreateInstanceFromVirtualPath () для создания объекта Page вместо этого? Вы можете спросить, как вы создаете этот объект. Существует несколько больше возможностей для создания новой страницы, чем newing up объект Page.

Например.

Page page 
       = BuildManager.CreateInstanceFromVirtualPath("~/Test.aspx", typeof(Page))

См. Также http://www.west -wind.com / weblog / posts / 120530.aspx для получения дополнительной информации.

1 голос
/ 13 апреля 2010

Можете ли вы сделать что-то вроде этого:

page.Form.Controls.AddAt(0, New ScriptManager())

Редактировать: Я думаю, вам также нужно добавить свой контроль в форму страницы, а не только на саму страницу, верно? Насколько я понимаю, форма создается со страницей, но если нет, то вы можете просто сделать:

page.Form = new HtmlForm()

Вам также может понадобиться что-то вроде:

page.Controls.Add(page.Form)
0 голосов
/ 01 мая 2010

Конечно, хитрость заключается в том, чтобы добавить его в обработчик события 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.

...