AngularJs解码HTML字符(不需要的)

时间:2016-05-01 12:54:26

标签: javascript angularjs asp.net-mvc character-encoding

我想将数据从HTML传递给AngularJs。这很好:

<div ng-init='initModel(@Model.ToJson())'></div>

实际HTML:

    <div ng-init='initModel({
      ...
        "description": "<pre><code>&lt;script&gt;alert(\"test\");&lt;/script&gt;\n</code></pre>",
        "title": "tes testse stsets sets"
      }
    },
    ...
})'></div>

描述已正确编码。 &lt; pre&gt;和&lt;代码&gt;元素未编码,这是受信任的HTML。 &lt; script&gt;标签已编码。

在我的AngularJs控制器中,我有这个功能:

$scope.initModel = function(model) {
   $scope.data = model.response.data;
}

如果我在此函数中放置断点,则模型的输出为:

"<pre><code><script>alert("test");</script>↵</code></pre>"

看起来AngularJs通过执行此initModel()函数解码所有HTML字符,但为什么呢?我想要在HTML中呈现相同的编码。

一些想法?

谢谢!

1 个答案:

答案 0 :(得分:0)

问题出在ToJson()函数中:

public static class JsonHelpers
    {
        public static IHtmlString ToJson<T>(this T obj)
        {
            var settings = new JsonSerializerSettings
            {
                ContractResolver = new CamelCasePropertyNamesContractResolver(),
                Formatting = Formatting.Indented,
                TypeNameHandling = TypeNameHandling.Objects
            };
            return MvcHtmlString.Create(JsonConvert.SerializeObject(obj, settings));
        }
    }

更改为:

public static class JsonHelpers
{
    public static string ToJson<T>(this T obj)
    {
        var settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            Formatting = Formatting.Indented,
            TypeNameHandling = TypeNameHandling.Objects
        };
        return JsonConvert.SerializeObject(obj, settings);
    }
}

解决了这个问题。