2010-06-25 47 views
0

當ASP.MVC服務器端代碼發生任何異常時,我想將異常的整個堆棧跟蹤並放置在ViewData中並返回給客戶端。例如:在ASP.MVC中,如何在ViewData中放置JavaScript友好的異常堆棧軌跡?

try 
{ 
    //some code 
} 
catch (SomeException e) 
{   
    ViewData["exceptionStack"] = e.StackTrace; 
} 

客戶端上的JavaScript只取得ViewData中的字符串並顯示它。例如:

<script type="text/javascript"> 
    var exceptionStack = '<%= ViewData["exceptionStack"] %>'; 
</script> 

的問題是我怎麼能保證,無論是通過正則表達式或其他手段,無論是在服務器端使用C#或客戶端的JavaScript變量exceptionStack將不包含任何非法字符上,所以,當我做:

$('#someElement').text(exceptionStack); 

$('#someElement').html(exceptionStack); 

不會有任何錯誤。

+0

你應該使用網址編碼我認爲。 – 2010-06-25 16:48:00

回答

1

你正在尋找的方法是HtmlHelper.Encode:

<script type="text/javascript"> 
    var exceptionStack = '<%= Html.Encode(ViewData["exceptionStack"] %>)'; 
</script> 
+0

ckramer的答案好多了。 – 2010-06-25 17:33:50

2

我要說的是,使用的HTMLEncode會工作。因此,從控制器:

// Stuff in the controller action that may cause an error 
catch(Exception ex) 
{ 
    ViewData["exceptionStack"] = Server.HtmlEncode(ex.ToString()); 
} 

如果出於某種原因HTML編碼不爲你工作,或者你想成爲額外的安全,你也可以使用AntiXSS庫:

// Stuff in the controller action that may cause an error 
catch(Exception ex) 
{ 
    ViewData["exceptionStack"] = AntiXss.JavaScriptEncode(ex.ToString()); 
} 

的HtmlEncoding可作爲的HtmlHelper:

<%= Html.Encode(ViewData["exceptionStack"]) %> 

你可以輕鬆地爲AntiXSS庫創建包裝

public static string JavaScriptEncode(this HtmlHelper helper, string input) 
{ 
    return AntiXss.JavaScriptEncode(input); 
} 

然後可以以同樣的方式被使用:

<%= Html.JavaScriptEncode(ViewData["exceptionStack"]) %> 

當然AntiXSS還爲HTML,XML,VBScript和URL編碼的編碼,所以你可以對任何或所有這些加幫手。

相關問題