昨日下午,IM上遇到菌哥,被問(wèn)到為什么安裝asp.net Ajax RC之后,某些頁(yè)面總是在創(chuàng)建UpdatePRogress時(shí)出現(xiàn)腳本錯(cuò)誤。當(dāng)時(shí)給了一個(gè)不太好的解決方案,剛才簡(jiǎn)單看了一下System.Web.Extensions.dll中的相關(guān)實(shí)現(xiàn),得出了一個(gè)更好的解決方案,在這里簡(jiǎn)單地說(shuō)一下。
首先,我模擬一個(gè)“事發(fā)現(xiàn)場(chǎng)”,由此開(kāi)始解決問(wèn)題:一般來(lái)說(shuō),在所有的頁(yè)面中可能需要統(tǒng)一的Updating Animation,于是可能會(huì)將一個(gè)UpdateProgress連同ScriptManager放在MasterPage中,如下:
Site.master
<asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Debug">
</asp:ScriptManager>
<asp:ContentPlaceHolder id="Main" runat="server"></asp:ContentPlaceHolder>
<asp:UpdateProgress ID="UpdateProgress1" runat="server">
<ProgressTemplate>
Hello World!
</ProgressTemplate>
</asp:UpdateProgress>
如果直接以此生成一個(gè)頁(yè)面,并隨意加上一個(gè)UpdatePanel:
Default.aspx
<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
<asp:UpdatePanel runat="server">
<ContentTemplate>
...
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
此時(shí)生成的HTML為:
HTML
...
<form>
...
<script src="/AjaxEnabledWebSite/WebResource.axd?..."
type="text/javascript"></script>
<!-- MicrosoftAjax.js -->
<script src="/AjaxEnabledWebSite/ScriptResource.axd?..."
type="text/Javascript"></script>
<!-- MicrosoftAjaxWebForms.js -->
<script src="/AjaxEnabledWebSite/ScriptResource.axd?..."
type="text/javascript"></script>
...
<script type="text/javascript">
<!--
Sys.application.initialize();
Sys.Application.add_init(function() {
$create(
Sys.UI._UpdateProgress,
{"associatedUpdatePanelId":null,
"displayAfter":500,
"dynamicLayout":true},
null,
null,
$get("ctl00_UpdateProgress1"));
});
// -->
</script>
...
</form>
...
請(qǐng)注意此時(shí)的UpdateProgress以一個(gè)Sys.UI.Control的形式使用$create被創(chuàng)建,而Sys.UI._UpdateProgress(看來(lái)ASP.NET AJAX不希望我們直接使用這個(gè)類(lèi))是在MicrosoftAjaxWebForms.js文件里被引入。
于是問(wèn)題就出現(xiàn)了,如果頁(yè)面中沒(méi)有UpdatePanel,那么MicrosoftAjaxWebForms.js文件不會(huì)被引入,而那句$create還在!這就導(dǎo)致了JavaScript錯(cuò)誤的發(fā)生。當(dāng)時(shí)我提供的方法是:那么就在Site.master里強(qiáng)制加上一個(gè)UpdatePanel吧。如下:
強(qiáng)制UpdatePanel
<asp:UpdatePanel runat="server" UpdateMode="Conditional" ID="UP1">
<ContentTemplate></ContentTemplate>
</asp:UpdatePanel>
這里把UpdateMode設(shè)為了Conditional,也就是說(shuō),這里的UpdatePanel永遠(yuǎn)不會(huì)被更新,它的作用只是“強(qiáng)迫”MicrosoftAjaxWebForms.js文件被引入。不過(guò)這不是個(gè)好的解決方案。
如果要解決這個(gè)問(wèn)題,不要讓$create語(yǔ)句出現(xiàn)不就可以了嗎?在查看過(guò)代碼以后,發(fā)現(xiàn)$create語(yǔ)句只會(huì)在ScriptManager的EnablePartialRendering屬性為T(mén)rue的情況下出現(xiàn),那么我們就把ScriptManager的這個(gè)屬性暴露出去吧。我們可以修改一下Site.master.cs中Site類(lèi)的代碼,把它增加一個(gè)屬性:
Site.master.cs
public bool EnablePartialRendering
{
get
{
return this.ScriptManager1.EnablePartialRendering;
}
set
{
this.ScriptManager1.EnablePartialRendering = value;
}
}
然后在頁(yè)面里把MasterPage的EnablePartialRendering屬性設(shè)為False即可。需要注意的是只有Init階段才能設(shè)置ScriptManager的EnablePartialRendering屬性。如下:
Default.aspx.cs
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
(this.Master as Site).EnablePartialRendering = false;
}
至此,任務(wù)結(jié)束。
http://www.survivalescaperooms.com/JeffreyZhao/archive/2006/12/20/597416.html
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注