Asp.net mvc 在MVC4中使用JsonConvert.SerializeObject清理输入?

Asp.net mvc 在MVC4中使用JsonConvert.SerializeObject清理输入?,asp.net-mvc,asp.net-mvc-4,knockout.js,json.net,Asp.net Mvc,Asp.net Mvc 4,Knockout.js,Json.net,长话短说,我试图在不修改保存的数据内容的情况下,对JsonConvert.SerializeObject的输出进行清理 我正在开发一个在视图中具有以下标记的应用程序: <textarea data-bind="value: aboutMe"></textarea> 如果保存以下文本,我会遇到问题: <script type="text/javascript">alert("hey")&l

长话短说,我试图在不修改保存的数据内容的情况下,对JsonConvert.SerializeObject的输出进行清理

我正在开发一个在视图中具有以下标记的应用程序:

                 <textarea data-bind="value: aboutMe"></textarea>

如果保存以下文本,我会遇到问题:

                 <script type="text/javascript">alert("hey")</script>
警报(“嘿”)
我在FF中遇到的错误:

违规文本的相关部分:

$(文档).ready(ko.applyBindings)(新) MyProfileVm({“profileUsername”:“admin”,“username”:“admin”,“aboutMe”:“alert”(\“hey\”),“title”:“这是一个 简短的自我介绍! :),“缩略图”:“locationZip”:“22182”,“locationName”:“维也纳, VA“

最后,在我看来:

<script type="text/javascript">
    $(document).ready(ko.applyBindings(new MyProfileVm(@Html.Raw(JsonConvert.SerializeObject(Model, new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() })))));
</script>

$(document).ready(ko.applyBindings(新的MyProfileVm(@Html.Raw(JsonConvert.SerializeObject)(Model,新的JsonSerializerSettings(){ContractResolver=new CamelCasePropertyNamesContractResolver()}'));
在这里,我将从MVC控制器获得的模型传递到js ViewModel中,以便将其映射到可观察数据中。原始编码似乎是问题所在,但我不确定如何处理它


要明确的是,我从服务器获取数据,并将其输出到客户端,这会破坏JSON/KO组合。

问题是,JavaScript字符串文本中不能有结束标记,因为浏览器将其解释为脚本块的结尾。另请参阅:

Asp.Net中没有内置函数,在输出生成的脚本之前,服务器端无法处理该函数。您需要将
替换为其他内容:

<script type="text/javascript">
    $(document).ready(ko.applyBindings(new MyProfileVm(@Html.Raw(
        JsonConvert.SerializeObject(Model, 
            new JsonSerializerSettings() { 
                 ContractResolver = new CamelCasePropertyNamesContractResolver() 
        }).Replace("</script>", "</scripttag>")
    ))));
</script>

演示。

我也遇到了类似的问题,它来自于像您一样使用knockout.js从
获取输入。在“创建”部分一切都很好,但一旦我通过
@Html.Raw(…)
将数据放回操作中,它就包含了破坏json字符串的换行符和回车符。 所以我加了这样的东西:

// Regex to replace all unescaped (single) backslashes in a string
private static Regex _regex = new Regex(@"(?<!\\)\\(?!\\)", RegexOptions.Compiled);
也许这能帮到你。我在razor视图中找到它,然后看看绳子。
这个问题也出现在未清除的选项卡(\t)和可能的其他转义序列中。

@SB2055我添加了一些示例,但是我更喜欢在javascript端逐个替换,因为这样我就可以明确知道除了脚本标记之外,我可以在哪个字段中执行其他操作。
@using YourExtensionMethodsNamespace

<script type="text/javascript">
        $(document).ready(ko.applyBindings(new MyProfileVm(@Html.Raw(
            Model.SerializeAndEscapeScriptTags()))));
</script>
var MyProfileVm = function(data) {
   //...
   this.aboutMe = ko.observable(
     // you need  `"</scr"+ "ipt>"` because of the above mentioned problem.
   data.aboutMe.replace(/<\/scripttag>/g, "</scr"+ "ipt>"));
}
function fixScriptTags(data) {
    for(var prop in data) {
        if (typeof(data[prop]) == "string") {
            data[prop] = data[prop].replace(/<\/scripttag>/g, "</scr"+ "ipt>");
        }
        //todo check for complex property values and call fixScriptTags recursively
    } 
    return data;
}
ko.applyBindings(new ViewModel(fixScriptTags(data)));
// Regex to replace all unescaped (single) backslashes in a string
private static Regex _regex = new Regex(@"(?<!\\)\\(?!\\)", RegexOptions.Compiled);
var coJson = JsonHelper.Serialize(co);
var coJsonEsc = _regex.Replace(coJson, @"\\")