在ASP.net MVC里用Jquery的Ajax功能调用相关LinqtoSQL生成的类出现错误---循环引用

本文探讨了使用LINQ to SQL进行数据操作并将其转换为JSON格式的方法,特别是在解决循环引用问题上的经验分享。
  • Linq to sql里实体转换为JSON的问题.

在学习段asp.net mvc 后.本想用做个这样的项目.只是在这里前台与后台通过xml通信不是我所喜欢的.
直到学习到JSON的传输,我想这就是我要用的了.如下.用Linq to sql来对象化数据.然后准备OK.先用JSON
下下来做个例子看看前台与后台如何用JSON通信.后台如下.

ContractedBlock.gif ExpandedBlockStart.gif Code
 1        public JsonResult GetJson()
 2ExpandedBlockStart.gifContractedBlock.gif        {
 3ExpandedSubBlockStart.gifContractedSubBlock.gif            JsonResult s = Json(new {Message1 = "It iss worked",Message2 = ".ageing"});
 4            return s;
 5        }

 6
 7        public ActionResult JqueryDemo(string content,string param)
 8ExpandedBlockStart.gifContractedBlock.gif        {
 9            List<string> data = new List<string>();
10            data.Add(content);
11            data.Add(param);
12            return Json(data);
13        }

前台如下.

ContractedBlock.gif ExpandedBlockStart.gif Code
 1    function DoSomething()
 2ExpandedBlockStart.gifContractedBlock.gif    {
 3        $("#region1").text("dsfsdsfsdfs");
 4        $.getJSON("Home/GetJson",null,function(data)
 5ExpandedSubBlockStart.gifContractedSubBlock.gif            {$("#region1").text(data.Message1);
 6            $("#region2").text(data.Message2);}
)                        
 7    }

 8    function GetByJquery()
 9ExpandedBlockStart.gifContractedBlock.gif    {
10ExpandedSubBlockStart.gifContractedSubBlock.gif        $.ajax({
11            type:"POST",
12            url:"/Home/JqueryDemo",
13            data:"content="+$("#input1").val()+"&param="+$("#region1").text(),
14            success:function(msg)
15ExpandedSubBlockStart.gifContractedSubBlock.gif            {            
16                $("#JqueryResult").text(msg);
17            }
,
18            complete:function(msg)
19ExpandedSubBlockStart.gifContractedSubBlock.gif            {
20            alert(msg);
21            }

22        }
)
23    }
  

实现没有什么问题.都是我相要的结果.然后我就想可以用数据库里的来和前台交互了.如下.

ContractedBlock.gif ExpandedBlockStart.gif Code
 1        public JsonResult GetTitle()
 2ExpandedBlockStart.gifContractedBlock.gif        {
 3            var titles = titleoperate.GetAll(2).ToArray();
 4            JsonResult s = Json(titles);
 5            var rss = from title in titles
 6ExpandedSubBlockStart.gifContractedSubBlock.gif                          select new { Title = title.Title, Statue = title.Statue };
 7     //     JObject d = new JObject(titles[0]);
 8            string ss = JsonConvert.SerializeObject(rss);
 9            string sss = JsonConvert.SerializeObject(titles);
10            return Json(titles);   
11        }

12    function GetJson()
13ExpandedBlockStart.gifContractedBlock.gif    {        
14ExpandedSubBlockStart.gifContractedSubBlock.gif        $.ajax({
15            type:"POST",
16            dataType:"json",
17            cache:"false",
18            url:"/Home/GetTitle",
19            data:"id="+$("#input1"),
20            success:function(msg)
21ExpandedSubBlockStart.gifContractedSubBlock.gif            {
22            alert("sfdsfsdfs");
23ExpandedSubBlockStart.gifContractedSubBlock.gif            $.each(msg,function(i,n){
24                var row = $("#see").clone();
25                row.find("#title").text(n.Title);
26                row.show();
27                row.appandTo("#see");
28                }
)
29            }
,
30            complete:function(msg)
31ExpandedSubBlockStart.gifContractedSubBlock.gif            {
32            alert(msg.responseText);
33            }

34        }
);
35ExpandedSubBlockStart.gifContractedSubBlock.gif        $.getJSON("Home/GetTitle",null,function(data){  
36        alert("scu");     
37ExpandedSubBlockStart.gifContractedSubBlock.gif        $.each(data,function(i,n){
38            var row = $("#see").clone();
39            row.find("#title").text(n.Title);
40            row.show();
41            row.appandTo("#see");
42            }
)
43        }
)
44    }

 到这里就有问题了.首先我想到是前台有问题,与是用IE8.0的调试器,呵呵,比较好用(本来老是用IE6的,因为想看某位牛人
的文章没办法才改的)发现了个好调试器.下断点后发现根本到不了success里.没办法.查找Jquery里的函数.发现这个
complete.不管成功与否,都用给你调用.我下断点到里.可以看到有个错误提示比较有用 --------- 循环引用--------.
但是不理解其含义.与是调试后台.MVC下有个json因为调试里信息不全,在网上找到json.net下来引用.发现还是解决不了.没办法
我把json.net项目加入到我的解决方案.然后开始跟踪调试.后终于找到错误地方.如下

这里后就会转入错误,最后我在这里分析后,然后查看linq to sql为我生成的代码.发现问题所在.如下所示.
在这里我看到了voteTitle.我说下的的结构吧.vote-问卷.votetitle-问卷题目.titleitem-题目选项.
vote-votetitle 一对多,votetitle-titleitem 一对多.
本身这里是要根据反射在找votetitle的属性,votetitle里因为包括titleitem,这也没什么.就找到titleitem,然后他又查找
titleitem
里的属性.这下问题来了.因为titleitem里有个属性就是原votetitle,这下好了,他又开始找votetitle了,形成了我所
开始不知道的循环引用.
下面给出linq to sql为我生成的代码.

在这得到原因.解决方法那就很多了.我就用json.net里的linq.如下.
            var rss = from title in titles
                          select new { Title = title.Title, Statue = title.Statue };
            string ss = JsonConvert.SerializeObject(rss);
这里生成的结果大家有想不通的可以看我前一遍文章.
http://www.cnblogs.com/zhouxin/archive/2009/09/09/1562970.html
最后感想.有个好的调试工具真的不错.(在大学里学java我就是因为受不了那个java给我的错误原因.转投到VC6,现在到VS).
本人水平有限,有什么错误的地方,希望大家指出.谢谢.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值