سؤال

أنا النامية WebPart (سيتم استخدامها في بيئة SharePoint ، على الرغم من أنها لا تستخدم طراز كائن) الذي أريد أن فضح وظائف اياكس في.بسبب طبيعة البيئة ، إضافة مدير النصي مباشرة إلى صفحة ليس خيارا ، لذلك يجب أن تضاف برمجيا.لقد حاولت إضافة ScriptManager السيطرة على الصفحة في webpart رمز.

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, التهيئة, تحميل, عرض مسبق أو تفريغ مراحل."

هل هناك طريقة أخرى لإضافة ScriptManager إلى الصفحة من WebPart ، أو أنا ذاهب إلى مجرد إضافة ScriptManager إلى كل صفحة (أو الصفحة الرئيسية) التي سوف تستخدم WebPart?

هل كانت مفيدة؟

المحلول

وكنت قادرا على الحصول على هذا العمل باستخدام الحدث التهيئة صفحة في:

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);
}

نصائح أخرى

ولقد فعلت هذا ويعمل. إنشاء نائب عن الضوابط:

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

وبعد ذلك يمكنك القيام بذلك في CreateChildControls:

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

وأنا واجهت هذه المشكلة مع عنصر تحكم ملقم ASCX المخصصة. حاولت العديد من الحلول التي تشمل إضافة النصي للأحداث 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);
    }
  }

وهذا فعل ذلك بالنسبة لي.

كان عندي نفس القضية الأساسية بقية لديك.لقد كان إنشاء مخصص التحكم 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);
     }
}

شكرا لك على الجميع في هذا الموضوع الذي جعلني أبدأ.

وهذه هي الطريقة الوحيدة التي يمكنني أن أحصل على لوحة تحديث للعمل في شير 2007/2010 جزء الويب متوافق. نحن نستخدم صفحة 2010 الماجستير مع scriptmanager لكن صفحة 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);
    }
}

ولقد استخدمت هذا الرمز في الرقابة على شبكة الإنترنت مخصص (.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);
    }
    //...
}

وكان لي هذه المشكلة مماثلة وجدت أن أفضل طريقة هي إضافة ScriptManager العالمي للmasterpage ثم في التعليمات البرمجية خلف يمكنك إضافة إليها من قبل:

ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference(virtualPath));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top