Kann nicht bekommen ScriptManager.RegisterStartupScript in WebControl in Update verschachtelt zu arbeiten

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

Frage

Ich habe, was ich glaube, soll ein ziemlich einfaches Problem sein, aber für das Leben von mir kann ich mein Problem nicht sehen. Das Problem zu ScriptManager.RegisterStartupScript verwendet ist, etwas, das ich schon viele Male zuvor benutzt.

Das Szenario, das ich habe ist, dass ich ein benutzerdefiniertes Web-Steuerelement, das in einer Seite eingefügt wurde. Die Kontrolle (und ein oder zwei andere) in einem Update verschachtelt. Sie werden auf der Seite auf ein Platzhalter eingefügt:

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

Dies ist der einzige Update-Panel auf der Seite.

Die Steuerung erfordert einige anfängliche Javascript ausgeführt werden, damit es richtig funktioniert. Die Steuer Anrufe:

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

und ich habe auch versucht:

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

Das Problem ist, dass das Skript ordnungsgemäß ausgeführt wird, wenn die Seite zum ersten Mal angezeigt, aber wieder nicht lief nach einer partiellen Postbacks. Ich habe folgendes versucht:

  1. Beim Registerstartup von Create
  2. Beim Registerstartup von OnLoad / OnPreRender
  3. Mit verschiedenen Kombinationen von Parametern für die ersten beiden Parameter (im Beispiel über den Control Seite und Typ ist GetType (), aber ich habe versucht, die Kontrolle selbst mit, etc).
  4. Ich habe persistent und neue IDs versucht, mit (nicht, dass ich glaube, dass dies einen großen Einfluss so oder so haben sollte).
  5. Ich habe ein paar Haltepunkte verwendet und so vergewissert haben, dass das Register Zeile korrekt aufgerufen wird.

Das einzige, was ich nicht versucht habe, ist die Update selbst als die Kontrolle und Art verwenden, wie ich von dem Update-Panel bewusst nicht glauben sollte die Kontrolle (und in jedem Fall scheint es keine guter Weg, um von erhalten des Update-Panel?).

Kann jemand sehen, was ich vielleicht in der oben falsch machen werden?

Danke:)


Nun, die Abfrage oben zu beantworten - es als angezeigt wird, wenn der Platzhalter irgendwie die ScriptManager.RegisterStartupScript vermasselt

.

Wenn ich ziehen Sie die Steuerung aus dem Platzhalter und Code direkt auf die Seite der Register Skript richtig funktioniert (ich auch die Steuerung mit bin selbst als Parameter).

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

jemand eine injizierte Kontrolle auf einen Platzhalter werfen kein Licht auf, warum das Script verhindern würde, korrekt die Skript Registrierung? Ich vermute, das ist etwas haben könnte, mit dem Lebenszyklus von dynamischen Kontrollen zu tun, würde aber schätzen (für mein eigenes Wissen), wenn es ein richtiges Verfahren für die oben ist.

War es hilfreich?

Lösung

Ich glaube, Sie sollten in der Tat der Kontrolle der Überlastung Registerstartup.

Ich habe den folgenden Code in einem Server-Steuerelement versucht:

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

Dann in meiner Seite habe ich:

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

Wo Platzhalter1 ist ein Platzhalter in einem Update-Panel. Der Platzhalter hat ein paar andere Kontrollen darin, einschließlich Tasten.

Dieser verhielt sich genau so, wie man erwarten würde, ich habe eine Warnung sagen „Hallo“ Ich jedes Mal die Seite oder verursacht geladen, um den Update-Panel zu aktualisieren.

Die andere Sache, die Sie aussehen könnten an ist in einige der Seitenlebenszyklus Ereignisse einzuhaken, die während einer Update-Panel Anfrage ausgelöst werden:

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

Die Pagerequestmanager endRequestHandler Ereignis ausgelöst wird jedes Mal ein Update-Panel ergänzt sein aktualisieren -. auf diese Weise könnten Sie eine Methode aufrufen Ihrer Kontrolle einzurichten

Meine einzigen andere Fragen sind:

  • Was ist Ihr Skript tatsächlich tun?
  • Vermutlich können Sie das Skript im HTML am unteren Rand der Seite (kurz vor dem schließenden tag) sehen?
  • Haben Sie versucht, ein paar "alert (" Here ") setzen;" Anrufe in Ihrem Startskript, um zu sehen, ob es korrekt aufgerufen wird?
  • Haben Sie versucht, Firefox und Firebug - ist, dass kein Skriptfehler Berichterstattung

Andere Tipps

hatte ich ein Problem diese Steuerung in einem Benutzer unter Verwendung von (in einer Seite dieses funktionierte gut); die Button1 befindet mich in einem updatepanel und der scriptmanager ist auf dem usercontrol.

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

Nun scheint es Sie mit den ersten beiden Argumente müssen vorsichtig sein, sie brauchen Ihre Seite zu verweisen, nicht die Kontrolle

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

Wenn Sie ScriptManager.RegisterStartupScript nennen, die „Control“ Parameter muss eine Steuerung sein, die in einem Update ist, die aktualisiert werden. Sie müssen es ändern:

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

Die Lösung ist die Skripte in einer Außen js Datei setzen (so genannten lets ‚yourDynamic.js‘) und erneut registrieren de-Datei jedes Mal wenn Sie die Update aktualisieren.

Ich benutze dies im updatepanel_prerender Ereignisse:

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

In der Seite oder in einem anderen schließen Sie das Javascript benötigen:

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

Ziemlich cool, ah ... Lol Dieser Teil von dem, was ich vor einiger Zeit geschrieben hier .

Hope diese Hilfe ...:)

hatte ich ein Problem mit Page.ClientScript.RegisterStartUpScript - ich war ein Update-Panel nicht verwenden, aber die Steuerung zwischengespeichert wurde. Dies bedeutete, dass ich das Skript in eine Literal einfügen musste (oder einen Platzhalter verwenden könnte) so, wenn sie aus dem Cache des Skript enthalten ist, wiedergegeben.

Eine ähnliche Lösung könnte für Sie arbeiten.

Verwenden Sie KEINE GUID Für Key

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

, und wenn Sie das tun wollen, rufen Sie so etwas wie diese Funktion

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

Was für mich gearbeitet, registriert es auf der Seite, während die Art wie die der Update Angabe, etwa so:

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

Manchmal tat es Feuer, wenn das Skript einige Syntaxfehler hat, stellen Sie sicher, dass das Skript und JavaScript-Syntax korrekt ist.

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

Der „true“ param Wert am Ende des ScriptManager.RegisterStartupScript wird einen JavaScript-Tag in Ihrer Seite hinzufügen:

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

Wenn der Wert wird „false“ nur das Skript witout des --script-- Tag injiziert.

Ich versuche, viele Dinge und fand schließlich, dass der letzte Parameter falsch sein muss, und Sie müssen <SCRIPT> Tag der Java-Skript hinzufügen:

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

ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), key, script, **false**);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top