簡體   English   中英

發生錯誤時調用JavaScript函數-ASP.NET

[英]Calling a javascript function when an error occurs - ASP.NET

我在頁面中重寫了OnError方法:

public string script;

    protected override void OnError(EventArgs e)
    {
        script = "alert('error');";
    }

在aspx中,我有這個:

<script type="text/javascript">
$(document).ready(function(){
        <%=script  %>;
    });
</script>

我正在模擬Page_Load的錯誤,但未觸發警報。 如果我將代碼從OnError切換到OnLoad ,則效果很好。

有什么想法嗎?

當您重寫OnError ,需要清除錯誤,以便將其標記為已處理。如果不執行此操作,則它將冒泡到Application_Error ,從而破壞了頁面可能呈現的任何內容。

嘗試使用Server.ClearError

protected override void OnError(EventArgs e)     
{         
   script = "alert('error');";
   Server.ClearError(); //Prevent the error from propagating     
}

看着反射鏡,您可以看到這一點。

try
{
    this.Context.TempError = e;
    this.OnError(EventArgs.Empty);
    if (this.Context.TempError == null)
    {
        return true;
    }
}
finally
{
    this.Context.TempError = null;
}

Server.ClearError清除該TempError

public void ClearError()
{
    if (this._tempError != null)
    {
        this._tempError = null;
    }
   ...other code..
 }

因為頁面沒有錯誤,所以沒有引發OnError事件。

還是您在強迫錯誤而警報仍然沒有顯示?

順便說一句,取出腳本插入中的標簽,然后得到警報-您已經在ASPX中定義了警報。

更新

這可能與調用的層次結構有關,在OnError發生之前,document.ready()被調用。

嘗試將整個內容寫成文字,例如:

<asp:Literal runat="server" ID="JScript" />

    protected override void OnError(EventArgs e)
        {
            JScript.Text = "<script type=\"text/javascript\">alert('error');</script>";
        }

您正在執行的操作將在輸出頁面中生成如下代碼:

<script type="text/javascript">
$(document).ready(function(){
   <script language='javascript' type='text/javascript'>alert('error')</script>;
});
</script>

這顯然是錯誤的。 您需要將script變量更改為:

script = @"alert('error')";

您拋出Exception並且沒有使用try / catch在頁面中對其進行處理的事實意味着該頁面永遠不會完成渲染。 您不僅沒有得到script字符串的輸出,還可能會發現沒有得到$(document).ready()或其他任何信息,因為頁面未呈現。

如果您像這樣處理異常,則頁面渲染將完成,並且將顯示您的消息。

try
{
    throw new Exception();
}
catch(Exception ex)
{
    // log ex.ToString() here
    script = "alert('error')";
    // decide what to do here - carry on or return
}

實際上,您應該嘗試避免捕獲Exception ,始終嘗試預期會遇到的特定異常並相應地進行處理。 實際上,請始終盡量避免首先拋出異常的情況-在特殊情況下應拋出異常。

通讀此CodeProject文章 ,其中討論了有關異常處理的一些最佳實踐。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM