Czy jedyną różnicą między opcjami RegisterStartupScripti the RegisterClientScriptBlockjest to, że RegisterStartupScript umieszcza javascript przed zamykającym </form>tagiem strony, a RegisterClientScriptBlock umieszcza go zaraz po początkowym <form>tagu strony?
Kiedy wybrałbyś jedną z nich? Napisałem krótką przykładową stronę, na której miałem problem i nie jestem pewien dokładnego powodu, dla którego tak się dzieje.
Oto znaczniki aspx:
<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>
Oto kod:
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());
}
}
Problem polega na tym, że kiedy klikam btnPostBackprzycisk, robi to postback i zmienia etykietę na czerwoną, ale kiedy klikam btnPostBack2, robi postback, ale kolor etykiety nie zmienia się na czerwony. Dlaczego to? Czy to dlatego, że etykieta nie została zainicjowana?
Przeczytałem również, że jeśli używasz UpdatePanel, musisz użyć ScriptManager.RegisterStartupScript, ale jeśli mam MasterPage, czy użyłbym ScriptManagerProxy?