【问题标题】:In ASP.MVC, how to place JavaScript-friendly Stack trace of exceptions in ViewData?在 ASP.MVC 中,如何在 ViewData 中放置 JavaScript 友好的堆栈跟踪异常?
【发布时间】:2010-06-25 16:44:34
【问题描述】:

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

不会有任何错误。

【问题讨论】:

  • 我认为你应该使用 url 编码。

标签: c# javascript asp.net-mvc


【解决方案1】:

我会说使用 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 编码的编码,因此您可以为任何或所有这些添加帮助器。

【讨论】:

    【解决方案2】:

    你要找的方法是HtmlHelper.Encode:

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

    【讨论】:

    • ckramer 的回答要好得多。
    猜你喜欢
    • 2010-09-13
    • 2014-08-06
    • 2011-01-05
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多