如何编码javascript字符串进行显示和回发?

时间:2013-09-26 22:06:06

标签: asp.net-mvc knockout.js encode json knockout-mvc

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

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

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

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

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

我暂时通过在我的Knockout View模型中添加一个计算属性来解决这个问题:

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

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

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

思想?

1 个答案:

答案 0 :(得分:3)

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

我希望我能理解你的问题。