Единственная разница между RegisterStartupScript
и RegisterClientScriptBlock
заключается в том, что RegisterStartupScript помещает javascript перед закрывающим </form>
тегом страницы, а RegisterClientScriptBlock помещает его сразу после начального <form>
тега страницы?
Кроме того, когда бы вы предпочли одно другому? Я написал краткий образец страницы, где у меня возникла проблема, и я не уверен, в какой именно причине это происходит.
Вот разметка 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>
Вот скрытый код:
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());
}
}
Проблема в том, что когда я нажимаю btnPostBack
кнопку, выполняется обратная передача и изменение метки на красный, но когда я нажимаю кнопку btnPostBack2
, выполняется обратная передача, но цвет метки не меняется на красный. Почему это? Это потому, что метка не инициализирована?
Я также читал, что если вы используете UpdatePanel
, вам нужно использовать ScriptManager.RegisterStartupScript
, но если у меня есть MasterPage
, я бы использовал ScriptManagerProxy
?
источник
Вот простейший пример из сообщества ASP.NET, он дал мне четкое представление о концепции ...
какая разница?
В качестве примера приведем способ навести фокус на текстовое поле на странице, когда страница загружается в браузер - с помощью Visual Basic, используя
RegisterStartupScript
метод:Page.ClientScript.RegisterStartupScript(Me.GetType(), "Testing", _ "document.forms[0]['TextBox1'].focus();", True)
Это хорошо работает, потому что текстовое поле на странице создается и размещается на странице к тому моменту, когда браузер переходит к нижней части страницы и переходит к этому небольшому фрагменту JavaScript.
Но, если бы вместо этого было написано так (с помощью
RegisterClientScriptBlock
метода):Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "Testing", _ "document.forms[0]['TextBox1'].focus();", True)
Фокус не попадет в элемент управления текстовым полем, и на странице будет сгенерирована ошибка JavaScript.
Причина этого в том, что браузер обнаружит код JavaScript до того, как текстовое поле появится на странице. Следовательно, JavaScript не сможет найти TextBox1.
источник