【问题标题】:JavaScriptSerializer().Serialize(Entity Framework object)JavaScriptSerializer().Serialize(实体框架对象)
【发布时间】:2010-03-15 19:46:21
【问题描述】:

可能是,这对您来说不是那么麻烦。但我第一次尝试使用 json 序列化。并阅读stackowerflow中的其他文章。

我已经创建了实体框架数据模型。 然后通过方法从对象中获取所有数据:

private uqsEntities _db = new uqsEntities();
//get all data from table sysMainTableColumns where tableName=paramtableName
public List<sysMainTableColumns> getDataAboutMainTable(string tableName)
{
     return (from column in _db.sysMainTableColumns
                    where column.TableName==tableName
                    select column).ToList();

}

我的网络服务:

public string getDataAboutMainTable()
{
    penta.DAC.Tables dictTable = new penta.DAC.Tables();
    var result = dictTable.getDataAboutMainTable("1");
    return new JavaScriptSerializer().Serialize(result);
}

和jQuery ajax方法

$('#loadData').click(function() {
            $.ajax({
                type: "POST",
                url: "WS/ConstructorWS.asmx/getDataAboutMainTable",
                data: "{}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function(msg) {
                    $("#jsonResponse").html(msg);

                    var data = eval("(" + msg + ")");
                    //do something with data
                },
                error: function(msg) {

                }
            });
        });

失败(来自 fairbug):

missing ] after element list [Break on this error] var data = eval("(" + msg + ")");

ajax 响应(如果我删除 var data = eval("(" + msg + ")"),则由 Firebug):

{"d":"[{\"ID\":1,\"TableName\":\"1\",\"Name\":\"d\",\"FullName\":\"f\",\"Type\":\"nvarchar(50)\",\"MeasurementUnit\":\"t         \",\"EntityState\":2,\"EntityKey\":{\"EntitySetName\":\"sysMainTableColumns\",\"EntityContainerName\":\"uqsEntities\",\"EntityKeyValues\":[{\"Key\":\"ID\",\"Value\":1}],\"IsTemporary\":false}},{\"ID\":2,\"TableName\":\"1\",\"Name\":\"e\",\"FullName\":\"e\",\"Type\":\"int\",\"MeasurementUnit\":\"r         \",\"EntityState\":2,\"EntityKey\":{\"EntitySetName\":\"sysMainTableColumns\",\"EntityContainerName\":\"uqsEntities\",\"EntityKeyValues\":[{\"Key\":\"ID\",\"Value\":2}],\"IsTemporary\":false}}]"}

数据有问题,代码在那里失败。而且我认为我没有很好地使用 JavaScriptSerializer().Serialize() 方法。

请告诉我,我在 C# 代码中犯了多大的错误?

【问题讨论】:

  • 失败?失败了怎么办?顺便说一句,eval 是不必要的。
  • @Craig-Stuntz:我想,现在我的问题已经形成了。可能是 eval 不是不必要的。但是为什么 ajax 响应包含像“:\”这样的标签?
  • 在我看来就像转义引号。顺便说一句,直接序列化实体是个坏主意,因为如果恰好包含循环引用,JavaScriptSerializer 就会死掉。
  • 我投射到一个匿名类型上。将select column 更改为select new { Id = column.Id, // etc.
  • $.each(msg.d, function ...) 那个“.d”很重要!

标签: c# json entity-framework .net-3.5 jsonserializer


【解决方案1】:
  1. 你不需要eval。当您指定 dataType: "json" 时,jQuery 会为您执行此操作
  2. 直接序列化实体是个坏主意,因为如果一个恰好包含循环引用,JavaScriptSerializer 将会死掉。
  3. 别忘了d!当根对象是一个数组时,WCF 服务会插入它以解决某些浏览器中的安全漏洞。

【讨论】:

  • 一直想知道那个“d”。知道在哪里可以找到更多相关信息吗?
  • 这是一项安全功能,因为在 JavaScript 中使用 GET 获取顶级数组时可能会受到攻击。与 return Json 在带有 GET 请求的 MVC 2 中不起作用的原因相同,除非您明确打开它。
【解决方案2】:

您是否尝试过使用 Firebug 或 Fiddler 进行调试以查看 JSON 内容的样子?

【讨论】:

  • 是的,抱歉,我忘记发布了。请问有什么问题的内容
猜你喜欢
  • 2011-11-26
  • 2011-03-04
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多