【问题标题】:Html.Raw(Json.Encode and Internet Explorer 9Html.Raw(Json.Encode 和 Internet Explorer 9
【发布时间】:2012-07-29 18:00:33
【问题描述】:

我在我的 Javascript 中使用 Html.Raw(Json.Encode 来获取传递给我的 MVC 3 asp.net (razor) 应用程序中的 View 的 ViewModel 属性的内容,如下所示:

 var state = @(Html.Raw(Json.Encode(Model.State))); 

状态是在我的模型中定义的

 public class IndexViewModel
    {
       //..other props
        public string State { get; set; }


    }

它在 FF 和 IE8 中就像一个魅力,但在 IE 9 上却卡住了。

关于上述在 IE 9 中更改的代码,我应该知道什么,因此这不再有效吗?如果是这样,在您的 JS 中获取 ViewModel 数据的替代方法是什么?

【问题讨论】:

    标签: json asp.net-mvc-3 internet-explorer-9


    【解决方案1】:

    这是另一种选择

    查看模型

    public class StuffVM : AsSerializable
    {
        public List<Stuff> StuffList { get; set; }
    }
    

    基类

    public abstract class AsSerializable
    {
        public string AsJson()
        {
            var serializer = new JavaScriptSerializer();
            return serializer.Serialize(this);
        }
    }
    

    查看

    <script>
     var ViewModelData = @( Html.Raw(Model.StuffVM.AsJson()) );
    </script>
    

    【讨论】:

      【解决方案2】:

      我真的很喜欢 Travis 的解决方案。另一种方法(如果您使用 C# 3.0 或更高版本)是使用扩展方法。

      public static class ObjectExtensions
      {
          static public string ToJson(this object model)
          {
              return new JavaScriptSerializer().Serialize(model);
          }
      }
      

      然而,这完全是一个哲学选择……是使用继承还是扩展方法。我个人的选择是扩展方法,因为它感觉更干净,耦合更少。这只是我的看法。

      但是,使用 Travis 的方法,您可以决定只创建一个序列化程序实例,并在需要执行多个序列化时重用该实例,这样在内存方面会更有效。如果您使用扩展方法执行此操作,则它不是线程安全的。

      【讨论】:

        猜你喜欢
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        • 2013-06-06
        • 2012-08-19
        • 1970-01-01
        • 2012-12-02
        • 2013-11-13
        • 1970-01-01
        相关资源
        最近更新 更多