您現(xiàn)在的位置:
365建站網(wǎng) >
365文章 > Linq to sql里實(shí)體轉(zhuǎn)換為JSON的問(wèn)題.-循環(huán)引用
Linq to sql里實(shí)體轉(zhuǎn)換為JSON的問(wèn)題.-循環(huán)引用
文章來(lái)源:365jz.com 點(diǎn)擊數(shù):
1271 更新時(shí)間:2009-09-17 10:28
參與評(píng)論
-
在學(xué)習(xí)段asp.net mvc 后.本想用做個(gè)這樣的項(xiàng)目.只是在這里前臺(tái)與后臺(tái)通過(guò)xml通信不是我所喜歡的.
直到學(xué)習(xí)到JSON的傳輸,我想這就是我要用的了.如下.用Linq to sql來(lái)對(duì)象化數(shù)據(jù).然后準(zhǔn)備OK.先用JSON
下下來(lái)做個(gè)例子看看前臺(tái)與后臺(tái)如何用JSON通信.后臺(tái)如下.

Code
1
public JsonResult GetJson()
2
{
3
JsonResult s = Json(new
{Message1 = "It iss worked",Message2 = "
.ageing"});
4
return s;
5
}
6
7
public ActionResult JqueryDemo(string content,string param)
8
{
9
List<string> data = new List<string>();
10
data.Add(content);
11
data.Add(param);
12
return Json(data);
13
}
前臺(tái)如下.

Code
1
function DoSomething()
2
{
3
$("#region1").text("dsfsdsfsdfs");
4
$.getJSON("Home/GetJson",null,function(data)
5
{$("#region1").text(data.Message1);
6
$("#region2").text(data.Message2);})
7
}
8
function GetByJquery()
9
{
10
$.ajax(
{
11
type:"POST",
12
url:"/Home/JqueryDemo",
13
data:"content="+$("#input1").val()+"¶m="+$("#region1").text(),
14
success:function(msg)
15
{
16
$("#JqueryResult").text(msg);
17
},
18
complete:function(msg)
19
{
20
alert(msg);
21
}
22
})
23
}
實(shí)現(xiàn)沒(méi)有什么問(wèn)題.都是我相要的結(jié)果.然后我就想可以用數(shù)據(jù)庫(kù)里的來(lái)和前臺(tái)交互了.如下.

Code
1
public JsonResult GetTitle()
2
{
3
var titles = titleoperate.GetAll(2).ToArray();
4
JsonResult s = Json(titles);
5
var rss = from title in titles
6
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()
13
{
14
$.ajax(
{
15
type:"POST",
16
dataType:"json",
17
cache:"false",
18
url:"/Home/GetTitle",
19
data:"id="+$("#input1"),
20
success:function(msg)
21
{
22
alert("sfdsfsdfs");
23
$.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)
31
{
32
alert(msg.responseText);
33
}
34
});
35
$.getJSON("Home/GetTitle",null,function(data)
{
36
alert("scu");
37
$.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
}
到這里就有問(wèn)題了.首先我想到是前臺(tái)有問(wèn)題,與是用IE8.0的調(diào)試器,呵呵,比較好用(本來(lái)老是用IE6的,因?yàn)橄肟茨澄慌H?br />的文章沒(méi)辦法才改的)發(fā)現(xiàn)了個(gè)好調(diào)試器.下斷點(diǎn)后發(fā)現(xiàn)根本到不了success里.沒(méi)辦法.查找Jquery里的函數(shù).發(fā)現(xiàn)這個(gè)
complete.不管成功與否,都用給你調(diào)用.我下斷點(diǎn)到里.可以看到有個(gè)錯(cuò)誤提示比較有用 --------- 循環(huán)引用--------.
但是不理解其含義.與是調(diào)試后臺(tái).MVC下有個(gè)json因?yàn)檎{(diào)試?yán)镄畔⒉蝗?在網(wǎng)上找到j(luò)son.net下來(lái)引用.發(fā)現(xiàn)還是解決不了.沒(méi)辦法
我把json.net項(xiàng)目加入到我的解決方案.然后開(kāi)始跟蹤調(diào)試.后終于找到錯(cuò)誤地方.如下

這里后就會(huì)轉(zhuǎn)入錯(cuò)誤,最后我在這里分析后,然后查看linq to sql為我生成的代碼.發(fā)現(xiàn)問(wèn)題所在.如下所示.
在這里我看到了voteTitle.我說(shuō)下的的結(jié)構(gòu)吧.vote-問(wèn)卷.votetitle-問(wèn)卷題目.titleitem-題目選項(xiàng).
vote-votetitle 一對(duì)多,votetitle-titleitem 一對(duì)多.
本身這里是要根據(jù)反射在找votetitle里的屬性,votetitle里因?yàn)榘?span style="color: #ff0000">titleitem,這也沒(méi)什么.就找到titleitem,然后他又查找
titleitem里的屬性.這下問(wèn)題來(lái)了.因?yàn)?span style="color: #ff0000">titleitem里有個(gè)屬性就是原votetitle,這下好了,他又開(kāi)始找votetitle了,形成了我所
開(kāi)始不知道的循環(huán)引用.
下面給出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);
這里生成的結(jié)果大家有想不通的可以看我前一遍文章.
http://www.cnblogs.com/zhouxin/archive/2009/09/09/1562970.html
最后感想.有個(gè)好的調(diào)試工具真的不錯(cuò).(在大學(xué)里學(xué)java我就是因?yàn)槭懿涣四莻€(gè)java給我的錯(cuò)誤原因.轉(zhuǎn)投到VC6,現(xiàn)在到VS).
本人水平有限,有什么錯(cuò)誤的地方,希望大家指出.謝謝.
如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇
------分隔線(xiàn)----------------------------