2010-10-07 84 views
1

我的应用程序有一个“显示所有评论”类似于Facebook中的一个。当用户点击“全部显示”链接时,我需要更新我的列表,其中最初有4条评论和所有评论。我会先显示一些代码,然后问一些问题:使用jQuery与ASP.NET MVC的帮助

jQuery: 
ShowAllComments = function (threadId) { 
    $.ajax({ 
     type: "POST", 
     url: "/Home/GetComments", 
     data: { 'threadId': threadId }, 
     dataType: "json", 
     success: function (result) { 
      alert(result); 
     }, 
     error: function (error) { 
      alert(error); 
     } 
    }); 
}; 

Home Controller: 
// GET: /GetComments 
[HttpPost] 
public JsonResult GetComments(int threadId) 
{ 
    var comments = repository.GetComments(threadId).ToList(); 
     return Json(comments); 
} 

问题:

  1. 当我试图GET而不是POST,我得到这个错误:“此请求已被阻止,因为敏感如果在GET请求中使用这些信息,可能会向第三方网站泄露信息。要允许GET请求,请将JsonRequestBehavior设置为AllowGet。“在进行这些Ajax请求时,通常建议使用POST而不是GET?如果不是,我如何才能使用GET?我在哪里设置JsonRequestBehavior AllowGet?

  2. 将其更改为POST后,现在出现此错误:序列化类型为'Models.Thread'的对象时检测到循环引用。我使用实体框架4,并且我读过在导航属性中添加[scriptignore]属性可以解决此问题,因此我添加了具有该属性的实体的部分类,它说“属性已经定义”。我如何处理这个问题是因为我无法直接修改EF4生成的代码。

+0

我不知道答案,但你可以尝试在EF4上使用POCO对象吗?这应该摆脱任何可能造成这种情况的额外班级成员。 – 2010-10-07 22:21:43

+0

这是我第一次尝试EF和MVC,所以我选择了默认值。我希望我现在可以做些什么来解决这个问题,因为我需要把这个网站拿出来,我不得不考虑在某个时候切换到POCO。 – Prabhu 2010-10-07 22:28:05

+0

这可能不是真的......通常使用ORMs,POCO会被东西包裹...所以懒惰加载工作......这可能是导致这种循环引用问题的原因。 – CrazyDart 2010-10-07 22:29:59

回答

2
  1. 设置在返回JSON。我只是使用后,但如果你想让你的自己很难,使用get。

    公共JsonResult嗒嗒() { 返回JSON( “OBJ”,JsonRequestBehavior.AllowGet); }

  2. 当大多数ORM对象得到初始化序列化尝试searlize隐藏的好东西ORM需求,以及(听起来像你的情况下),所有的延迟加载的东西...这会导致不好的魔力这是真的。我可以提出一个建议吗?为什么不让MVC做你擅长的事情并为你创造看法?你可以使用jQuery .load并使用视图。

+0

所以你的意思不是用json结果自己操纵DOM,只需通过.load调用操作方法来获得AJAX效果? – Prabhu 2010-10-07 22:30:22

+0

这是正确的! $( “#resultdiv”)。load(url,{'threadId':threadId});应该为你解决。 – CrazyDart 2010-10-07 22:33:58

+0

我在想,这是MVVC的另一个很好的理由...查看模型。你应该有一个简单的视图模型,只显示你需要放在视图中,或者在这种情况下作为JSON对象返回。看看这篇文章:http://stackoverflow.com/questions/657939/serialize-entity-framework-objects-into-json – CrazyDart 2010-10-07 22:37:58

0

答案:

  1. 尝试return Json(comments, JsonRequestBehavior.AllowGet);有很好的理由,虽然默认行为。
  2. 对于任何事情都会发生变化,您将确实想创建一个非常简单的视图模型对象,而不是将您的域实体发送到电线上。许多花哨的事情发生在EntityFramework中,不会像序列化那样工作。
+0

那么这背后的逻辑是什么?为什么默认设置不允许我进行GET? – Prabhu 2010-10-09 08:16:22