Ist der einzige Unterschied zwischen dem RegisterStartupScript
und dem, RegisterClientScriptBlock
dass RegisterStartupScript das Javascript vor das schließende </form>
Tag der Seite und RegisterClientScriptBlock direkt nach dem Start- <form>
Tag der Seite setzt?
Und wann würden Sie einen über den anderen wählen? Ich habe eine kurze Beispielseite geschrieben, auf der ich ein Problem hatte, und ich bin mir nicht sicher, warum es genau passiert.
Hier ist das Aspx-Markup:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblDisplayDate" runat="server"
Text="Label" /><br />
<asp:Button ID="btnPostback" runat="server"
Text="Register Startup Script"
onclick="btnPostback_Click" /><br />
<asp:Button ID="btnPostBack2" runat="server"
Text="Register"
onclick="btnPostBack2_Click" />
</div>
</form>
</body>
</html>
Hier ist der Code dahinter:
protected void Page_Load(object sender, EventArgs e)
{
lblDisplayDate.Text = DateTime.Now.ToString("T");
}
protected void btnPostback_Click(object sender, EventArgs e)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append(@"<script language='javascript'>");
sb.Append(@"var lbl = document.getElementById('lblDisplayDate');");
sb.Append(@"lbl.style.color='red';");
sb.Append(@"</script>");
if(!ClientScript.IsStartupScriptRegistered("JSScript"))
{
ClientScript.RegisterStartupScript(this.GetType(),"JSScript",
sb.ToString());
}
}
protected void btnPostBack2_Click(object sender, EventArgs e)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append(@"<script language='javascript'>");
sb.Append(@"var lbl = document.getElementById('lblDisplayDate');");
sb.Append(@"lbl.style.color='red';");
sb.Append(@"</script>");
if (!ClientScript.IsClientScriptBlockRegistered("JSScriptBlock"))
{
ClientScript.RegisterClientScriptBlock(this.GetType(), "JSScriptBlock",
sb.ToString());
}
}
Das Problem ist, wenn ich auf die btnPostBack
Schaltfläche klicke, ein Postback erstellt und das Etikett in Rot geändert wird. Wenn ich jedoch auf das btnPostBack2
klicke, wird ein Postback ausgeführt, aber die Etikettenfarbe ändert sich nicht in Rot. Warum ist das? Liegt es daran, dass das Label nicht initialisiert ist?
Ich habe auch gelesen, dass Sie, wenn Sie eine verwenden UpdatePanel
, diese verwenden müssen ScriptManager.RegisterStartupScript
, aber wenn ich eine habe MasterPage
, würde ich sie verwenden ScriptManagerProxy
?
quelle
Hier ist ein einfachstes Beispiel aus der ASP.NET-Community. Dies gab mir ein klares Verständnis für das Konzept.
Welchen Unterschied macht das?
Ein Beispiel hierfür ist eine Möglichkeit, den Fokus auf ein Textfeld auf einer Seite zu legen, wenn die Seite in den Browser geladen wird - mit Visual Basic mithilfe der folgenden
RegisterStartupScript
Methode:Dies funktioniert gut, da das Textfeld auf der Seite generiert und auf der Seite platziert wird, wenn der Browser den unteren Rand der Seite erreicht und dieses kleine Stück JavaScript erreicht.
Aber wenn es stattdessen so geschrieben wurde (mit der
RegisterClientScriptBlock
Methode):Der Fokus wird nicht auf das Textfeldsteuerelement gelegt und ein JavaScript-Fehler wird auf der Seite generiert
Der Grund dafür ist, dass der Browser auf das JavaScript stößt, bevor sich das Textfeld auf der Seite befindet. Daher kann das JavaScript keine TextBox1 finden.
quelle