Ist der einzige Unterschied zwischen dem RegisterStartupScriptund dem, RegisterClientScriptBlockdass 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 btnPostBackSchaltfläche klicke, ein Postback erstellt und das Etikett in Rot geändert wird. Wenn ich jedoch auf das btnPostBack2klicke, 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?