当ASP.MVC服务器端代码发生任何异常时,我想获取异常的整个堆栈跟踪并放在ViewData中并返回到客户端。例如:
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 :(得分: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编码的编码,因此您可以为任何或所有这些编码添加帮助。
答案 1 :(得分:1)
您正在寻找的方法是HtmlHelper.Encode:
<script type="text/javascript">
var exceptionStack = '<%= Html.Encode(ViewData["exceptionStack"] %>)';
</script>