在ASP.MVC中,如何在ViewData中放置JavaScript友好的Stack异常跟踪?

时间:2010-06-25 16:44:35

标签: c# javascript asp.net-mvc

当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);

不会有任何错误。

2 个答案:

答案 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>