3

我有一个 MVC 应用程序,它正在客户端上呈现以下 javascript:

var rawData = [{"ID":5317,"Code":"12345","Description":"sometext \u003c/= 100"}];

JSON 数据是使用JavaScriptSerializer序列化对象然后通过 Html.Raw() 帮助程序运行结果的结果。

然后使用此数据加载淘汰视图模型并在悬停时显示弹出窗口。在弹出窗口中,仅显示“Description”属性的“sometext”部分,因为在设置 rawData 变量时字符串被转换为未编码版本(即 \u003c 转换为 <)。

此外,这些数据最终会在保存数据后被发送回服务器,并且 ASP.NET 验证启动并在检测到“

我暂时通过向我的 Knockout 视图模型添加一个计算属性来解决这个问题,如下所示:

self.DescriptionEncoded = ko.observable('');
self.Description = ko.computed({
             read: function() {
                  return self.DescriptionEncoded ();
             },
             write: function(value) {
                 self.DescriptionEncoded($('<div/>').text(value).html());
             }
         });

通过这种方式,我可以从弹出窗口访问转义属性,并且当我序列化我的视图模型(使用 .toJSON())时,未转义的值不会发送回服务器。

有没有更全局的方法来处理这个问题,而不是为每个可能有一些似乎是错误请求的文本的对象创建计算属性,同时又不影响安全性?我已经考虑过序列化例程的重载/帮助程序,它将接受属性列表以应用查找/替换我认为这必须以类似于我已经处理过的方式逐个处理完毕。至于将数据发送回服务器,我可以覆盖我的视图模型上的 toJSON() 方法并删除不需要发送回的属性,但这对我的弹出窗口没有帮助。

想法?

4

1 回答 1

3

您可以使用Ajax.JavaScriptStringEncode进行编码进行编码。您还可以获取 AntiXSS 库并将其用于编码。

我希望我能很好地理解你的问题。

于 2013-10-06T21:45:41.030 回答