2010-06-25 119 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编码的编码,所以你可以对任何或所有这些加帮手。