لا يمكن الحصول على ScriptManager.RegisterStartupScript في WebControl متداخلة في UpdatePanel العمل

StackOverflow https://stackoverflow.com/questions/802506

سؤال

أنا الحصول على ما أعتقد يجب أن تكون بسيطة إلى حد ما مشكلة لكن بالنسبة لي لا أرى مشكلة.المشكلة تتعلق ScriptManager.RegisterStartupScript شيء لقد استخدمت مرات عديدة من قبل.

السيناريو الذي لدي هو أن لدي ويب مخصصة التحكم التي تم إدراجها في الصفحة.التحكم (واحد أو اثنين آخرين) متداخلة داخل UpdatePanel.يتم إدراجها على صفحة على النائب:

<asp:UpdatePanel ID="pnlAjax" runat="server">
  <ContentTemplate>
    <asp:PlaceHolder ID="placeholder" runat="server">
    </asp:PlaceHolder>
    ...

protected override void OnInit(EventArgs e){
  placeholder.Controls.Add(Factory.CreateControl());
  base.OnInit(e);
}

هذا هو فقط تحديث لوحة على الصفحة.

التحكم يتطلب بعض الأولي جافا سكريبت تشغيل من أجل أن تعمل بشكل صحيح.مراقبة المكالمات:

ScriptManager.RegisterStartupScript(this, GetType(), 
                                    Guid.NewGuid().ToString(), script, true);

ولقد حاول أيضا:

ScriptManager.RegisterStartupScript(Page, Page.GetType(), 
                                    Guid.NewGuid().ToString(), script, true);

المشكلة هي أن البرنامج النصي بشكل صحيح عندما تكون الصفحة الأولى المعروضة ولكن لا إعادة تشغيل بعد إعادة النشر الجزئي.لقد حاولت التالية:

  1. داعيا RegisterStartupScript من CreateChildControls
  2. داعيا RegisterStartupScript من OnLoad / OnPreRender
  3. استخدام تركيبات مختلفة من المعلمات لأول المعلمتين (في المثال أعلاه التحكم هي صفحة نوع GetType () ، ولكن أنا حاولت السيطرة على نفسها ، إلخ).
  4. لقد حاولت استخدام المستمرة والجديدة معرفات (لا أعتقد أن هذا ينبغي أن يكون لها تأثير كبير في كلتا الحالتين).
  5. لقد استخدمت عدة نقاط و ذلك التحقق من أن سجل خط يسمى بشكل صحيح.

الشيء الوحيد الذي لم يحاكم هو استخدام UpdatePanel نفسها على التحكم في نوع ، كما أنني لا أعتقد أن الرقابة يجب أن تكون على بينة من تحديث لوحة (وعلى أي حال هناك لا يبدو أن يكون وسيلة جيدة للحصول على تحديث لوحة؟).

يمكن لأي شخص رؤية ما قد يكون به خطأ في أعلاه ؟

شكرا :)


حسنا الإجابة على الاستعلام أعلاه يبدو كما لو كان نائبا بطريقة أو بأخرى لعبث ScriptManager.RegisterStartupScript.

عندما سحب السيطرة من نائب البرمجية مباشرة على صفحة تسجيل البرنامج النصي يعمل بشكل صحيح (أنا أيضا باستخدام التحكم نفسها معلمة).

ScriptManager.RegisterStartupScript(this, GetType(), Guid.NewGuid().ToString(), script, true);

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

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

المحلول

أعتقد أنه يجب أن يكون في الواقع باستخدام التحكم الزائد من RegisterStartupScript.

لقد حاولت البرمجية التالية في وحدة تحكم ملقم:

[ToolboxData("<{0}:AlertControl runat=server></{0}:AlertControl>")]
public class AlertControl : Control{
    protected override void OnInit(EventArgs e){
        base.OnInit(e);
        string script = "alert(\"Hello!\");";
        ScriptManager.RegisterStartupScript(this, GetType(), 
                      "ServerControlScript", script, true);
    }
}

ثم في الصفحة يجب:

protected override void OnInit(EventArgs e){
    base.OnInit(e);
    Placeholder1.Controls.Add(new AlertControl());
}

حيث Placeholder1 هو نائب في التحديث الفريق.العنصر النائب لديه اثنين من عناصر التحكم الأخرى في ذلك ، بما في ذلك الأزرار.

هذا تصرف تماما كما كنت تتوقع ، حصلت تنبيه يقول "مرحبا" في كل مرة يتم تحميل الصفحة أو تسبب لوحة التحديث إلى تحديث.

الشيء الآخر هل يمكن أن ننظر إلى ربط في بعض الصفحات دورة حياة الأحداث التي أطلقت أثناء تحديث لوحة الطلب:

Sys.WebForms.PageRequestManager.getInstance()
   .add_endRequest(EndRequestHandler);

على PageRequestManager endRequestHandler الحدث الحرائق في كل مرة تحديث لوحة يكمل التحديث - وهذا سوف يسمح لك استدعاء أسلوب إعداد التحكم الخاصة بك.

بلدي فقط أسئلة أخرى هي:

  • ما هو السيناريو الخاص بك في الواقع تفعل ؟
  • ويفترض يمكنك أن ترى السيناريو في HTML في الجزء السفلي من الصفحة (فقط قبل إغلاق </form> الوسم)?
  • هل حاولت وضع بعض "alert("هنا");" يدعو في البرنامج النصي لبدء التشغيل لمعرفة ما إذا كان يجري يسمى بشكل صحيح ؟
  • هل جربت فايرفوكس الحرائق هل هذا الإبلاغ عن أي سيناريو الأخطاء ؟

نصائح أخرى

لدي مشكلة في استخدام هذا في عنصر تحكم المستخدم (في صفحة هذا عملت بخير) ؛ Button1 هو داخل updatepanel, ، scriptmanager على usercontrol.

protected void Button1_Click(object sender, EventArgs e)  
{  
    string scriptstring = "alert('Welcome');";  
    ScriptManager.RegisterStartupScript(this, this.GetType(), "alertscript", scriptstring, true);  
}

الآن يبدو عليك أن تكون حذرا مع أول اثنين من الحجج ، فإنها تحتاج إلى الرجوع إلى الصفحة الخاصة بك ، وليس التحكم الخاصة بك

ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "alertscript", scriptstring, true);

عند استدعاء ScriptManager.RegisterStartupScript ، "السيطرة" المعلمة يجب أن يكون التحكم في UpdatePanel التي سيتم تحديثها.تحتاج إلى تغييره إلى:

ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(), script, true);

الحل هو وضع النصوص في خارج ملف js (يتيح يسمى 'yourDynamic.js') و إعادة تسجيل دي ملف في كل مرة تقوم بتحديث updatepanel.

أنا استخدم هذا في updatepanel_prerender الحدث:

ScriptManager.RegisterClientScriptBlock(UpdatePanel1, UpdatePanel1.GetType(), "UpdatePanel1_PreRender", _
                   "<script type='text/javascript' id='UpdatePanel1_PreRender'>" & _
                   "include('yourDynamic.js');" & _
                   "removeDuplicatedScript('UpdatePanel1_PreRender');</script>" _
                   , False)

في الصفحة أو في بعض الدول الأخرى تشمل سوف تحتاج هذه جافا سكريبت:

// Include a javascript file inside another one.
function include(filename)
{
    var head = document.getElementsByTagName('head')[0];

    var scripts = document.getElementsByTagName('script');
    for(var x=0;x<scripts.length;>    {
        if (scripts[x].getAttribute('src'))
        {
            if(scripts[x].getAttribute('src').indexOf(filename) != -1)
            {
                head.removeChild(scripts[x]);
                break;
            }
        }
    }

    script = document.createElement('script');
    script.src = filename;
    script.type = 'text/javascript';
    head.appendChild(script)
}

// Removes duplicated scripts.
function removeDuplicatedScript(id)
{
    var count = 0;
    var head = document.getElementsByTagName('head')[0];

    var scripts = document.getElementsByTagName('script');
    var firstScript;
    for(var x=0;x<scripts.length;>    {
        if (scripts[x].getAttribute('id'))
        {
            if(scripts[x].getAttribute('id').indexOf(id) != -1)
            {
                if (count == 0)
                {
                    firstScript = scripts[x];
                    count++;
                }
                else
                {
                    head.removeChild(firstScript);
                    firstScript = scripts[x];
                    count = 1;
                }
            }
        }
    }
    clearAjaxNetJunk();
}
// Evoids the update panel auto generated scripts to grow to inifity. X-(
function clearAjaxNetJunk()
{
    var knowJunk = 'Sys.Application.add_init(function() {';
    var count = 0;
    var head = document.getElementsByTagName('head')[0];

    var scripts = document.getElementsByTagName('script');
    var firstScript;
    for(var x=0;x<scripts.length;>    {
        if (scripts[x].textContent)
        {
            if(scripts[x].textContent.indexOf(knowJunk) != -1)
            {
                if (count == 0)
                {
                    firstScript = scripts[x];
                    count++;
                }
                else
                {
                    head.removeChild(firstScript);
                    firstScript = scripts[x];
                    count = 1;
                }
            }
        }
    }
}

بارد جدا ، آه...jejeje هذا جزء من ما نشر منذ بعض الوقت هنا.

نأمل أن يكون هذا مساعدة...:)

كان لي مشكلة مع الصفحة.ClientScript.RegisterStartUpScript - لم أكن باستخدام لوحة التحديث, ولكن السيطرة كانت مؤقتا.هذا يعني أنه كان على إدراج البرنامج النصي في حرفي (أو يمكن استخدام عنصر نائب) لذلك عندما المقدمة من ذاكرة التخزين المؤقت البرنامج النصي المضمنة.

حل مماثل قد عمل لك.

لا تستخدم GUID الرئيسية

ScriptManager.RegisterClientScriptBlock(this.Page, typeof(UpdatePanel) 
       Guid.NewGuid().ToString(), myScript, true);

وإذا كنت تريد أن تفعل ذلك ، نطلق على مثل هذه الوظيفة

 public static string GetGuidClear(string x)
 {
      return x.Replace("-", "").Replace("0", "").Replace("1", "")
              .Replace("2",  "").Replace("3", "").Replace("4", "")
              .Replace("5", "").Replace("6", "").Replace("7", "")
              .Replace("8", "").Replace("9", "");
 }

ما عملت بالنسبة لي هو التسجيل على الصفحة مع تحديد النوع كما ان من UpdatePanel مثل:

ScriptManager.RegisterClientScriptBlock(this.Page, typeof(UpdatePanel) Guid.NewGuid().ToString(), myScript, true);

في بعض الأحيان أنها لا النار عندما النصي لديه بعض خطأ في بناء الجملة ، تأكد من سكربت جافا سكريبت الجملة صحيحة.

ScriptManager.RegisterStartupScript(this, this.GetType(), Guid.NewGuid().ToString(),script,  true );

"صحيح" المعلمة القيمة في نهاية ScriptManager.RegisterStartupScript إضافة جافا سكريبت الوسم داخل الصفحة الخاصة بك:

<script language='javascript' defer='defer'>your script</script >

إذا كانت قيمة سوف تكون "كاذبة" أنه سيتم حقن فقط النصي وتوت الـ script-- الوسم.

لقد حاول العديد من الأمور وأخيرا وجدت أن المعلمة الأخيرة يجب أن تكون كاذبة و يجب إضافة <SCRIPT> العلامة java script :

string script = "< SCRIPT >alert('hello!');< /SCRIPT>";

ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), key, script, **false**);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top