Подтвердить что ты не робот

Добавить ScriptManager в страницу программно?

Я разрабатываю WebPart (он будет использоваться в среде SharePoint, хотя он не использует объектную модель), в котором я хочу открыть функциональность AJAX. Из-за природы среды добавление Script Manager прямо на страницу не является опцией, и поэтому ее необходимо добавить программно. Я попытался добавить элемент ScriptManager к странице в моем коде веб-сайта.

protected override void CreateChildControls()
{
    if (ScriptManager.GetCurrent(Page) == null)
    {
        ScriptManager sMgr = new ScriptManager();
        // Ensure the ScriptManager is the first control.
        Page.Form.Controls.AddAt(0, sMgr); 
    }
}

Однако, когда этот код выполняется, появляется следующее сообщение об ошибке:

"Коллекция управления не может быть изменена во время фаз DataBind, Init, Load, PreRender или Unload."

Есть ли другой способ добавить ScriptManager на страницу из WebPart, или мне нужно просто добавить ScriptManager на каждую страницу (или главную страницу), которая будет использовать WebPart?

4b9b3361

Ответ 1

Мне удалось заставить это работать, используя событие Page Init:

protected override void OnInit(EventArgs e)
{
    Page.Init += delegate(object sender, EventArgs e_Init)
                 {
                     if (ScriptManager.GetCurrent(Page) == null)
                     {
                         ScriptManager sMgr = new ScriptManager();
                         Page.Form.Controls.AddAt(0, sMgr);
                     }
                 };
    base.OnInit(e);
}

Ответ 2

Я сделал это, и он работает. Создайте заполнитель для элементов управления:

<asp:PlaceHolder ID="WebGridPlaceholder" runat="server" >
</asp:PlaceHolder>

Затем вы можете сделать это в CreateChildControls:

ScriptManager aSM = new ScriptManager();
aSM.ID = "GridScriptManager";
WebGridPlaceholder.Controls.Add(aSM);

Ответ 3

Я столкнулся с этой проблемой с пользовательским элементом управления ascx-сервером. Я пробовал много решений, связанных с добавлением script к событиям OnInit элемента управления (который не запускается до тех пор, пока он не проверит элемент управления ScriptManager), добавив логику внутри тегов сервера в элементе управления и добавив вещи ко всем другим мероприятие. Не хорошо. Я, наконец, создал элемент управления, который наследуется от ScriptManagerProxy, а затем использует ktrauberman часть кода, слегка измененную, чтобы добавить ScriptManager при необходимости:

  public class ProxiedScriptManager : ScriptManagerProxy
  {
    protected override void OnInit(EventArgs e)
    {
      //double check for script-manager, if one doesn't exist, 
      //then create one and add it to the page
      if (ScriptManager.GetCurrent(this.Page) == null)
      {
        ScriptManager sManager = new ScriptManager();
        sManager.ID = "sManager_" + DateTime.Now.Ticks;
        Controls.AddAt(0, sManager);
      }

      base.OnInit(e);
    }
  }

Это сделало это для меня.

Ответ 4

У меня была такая же основная проблема, как и все остальные. Я создавал пользовательский элемент управления ascx и хотел быть в состоянии не беспокоиться о том, объявлена ​​ли вызывающая страница объявленным scriptmanager. Я обошел проблемы, добавив следующее в ascx contorl.

на странице ascx -

<asp:PlaceHolder runat="server" ID="phScriptManager"></asp:PlaceHolder>

в самой панели обновления - oninit="updatePanel1_Init"

в файл ascx.cs -

protected void updatePanel1_Init(object sender, EventArgs e)
{
     if (ScriptManager.GetCurrent(this.Page) == null)
     {
         ScriptManager sManager = new ScriptManager();
         sManager.ID = "sManager_" + DateTime.Now.Ticks;
         phScriptManager.Controls.AddAt(0, sManager);
     }
}

Спасибо всем, кто в этой теме, кто меня начал.

Ответ 5

Это единственный способ заставить мою панель обновления работать в совместимой веб-части sharepoint 2007/2010. Мы используем главную страницу 2010 со сценарием, но главная страница 2007 без нее.

.ascx

<asp:PlaceHolder ID="sMgr_place" runat="server" />
<asp:UpdatePanel runat="server" OnInit="updatePanel_Init"><ContentTemplate>
...
</ContentTemplate></asp:UpdatePanel>

.ascx.cs

public void updatePanel_Init(object sender, EventArgs e)
{
    if (ScriptManager.GetCurrent(Page) == null)
    {
        ScriptManager sMgr = new ScriptManager();
        sMgr.EnablePartialRendering = true;
        sMgr_place.Controls.Add(sMgr);
    }
}

Ответ 6

Я использовал этот код в пользовательских веб-элементах управления (.cs), которые содержат панели обновлений.

protected override void OnInit(EventArgs e)
{
    //...
    if (ScriptManager.GetCurrent(this.Page) == null)
    {
        ScriptManager scriptManager = new ScriptManager();
        scriptManager.ID = "scriptManager_" + DateTime.Now.Ticks;
        Controls.AddAt(0, scriptManager);
    }
    //...
}

Ответ 7

У меня была подобная проблема, и я нашел лучший способ добавить глобальный ScriptManager к главной странице, а затем в код, который вы можете добавить к нему,:

ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference(virtualPath));