【问题标题】:Help with using jQuery with ASP.NET MVC帮助在 ASP.NET MVC 中使用 jQuery
【发布时间】:2011-04-22 15:00:36
【问题描述】:

我的应用有一个类似于 Facebook 中的“显示所有 cmets”。当用户单击“全部显示”链接时,我需要更新我的列表,该列表最初最多包含 4 个 cmets,其中包含所有 cmets。我会先展示一些代码,然后再问一些问题:

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”类型的对象时检测到循环引用。我正在使用 Entity Framework 4,并且我读过在导航属性上添加一个 [scriptignore] 属性可以解决这个问题,所以我添加了一个带有属性的实体的部分类,它说“属性已经定义”。那我该如何处理,因为我无法直接修改 EF4 生成的代码。

【问题讨论】:

  • 我不知道答案,但是您可以尝试在 EF4 中使用 POCO 对象吗?这应该消除任何可能导致这种情况的额外类成员。
  • 这是我第一次尝试使用 EF 和 MVC,所以我选择了默认值。我希望我现在可以做些什么来解决这个问题,因为我需要把这个网站弄出来,而且我不得不考虑在某个时候切换到 POCO。
  • 这可能不是真的......通常使用 ORM 时,POCO 会被东西包裹起来......所以延迟加载工作......这很可能是导致这个循环引用问题的原因。

标签: c# .net jquery asp.net-mvc entity-framework


【解决方案1】:
  1. 在返回的 Json 中设置。我只会使用 post,但如果您想让自己变得困难,请使用 get。

    公共 JsonResult 等等() { 返回 Json("obj", JsonRequestBehavior.AllowGet); }

  2. 这是真的,当大多数 ORM 对象被序列化时,序列化会尝试对 ORM 需要的隐藏的好东西进行序列化,并且(听起来像你的情况)所有延迟加载的东西......这会导致不好的魔力。我可以提出建议吗?为什么不让 MVC 做它擅长的事情并为你生成视图呢?您可以只使用 jQuery .load 并使用视图。

【讨论】:

  • 所以你的意思不是自己用json结果来操作DOM,而是通过.load调用action方法来获得AJAX效果?
  • 没错!! $("#resultdiv").load(url, { 'threadId': threadId });应该适合你。
  • 我在想,这是 MVVC 的另一个很好的理由...查看模型。您应该有一个简单的视图模型,它只显示您需要在视图中放置的内容,或者在这种情况下作为 JSON 对象返回。看看这篇文章:stackoverflow.com/questions/657939/…
  • 好的,我会在这个之后停下来......我有更好的事情要做......出于搜索引擎优化的原因,您可以删除 threadId,而只使用路由的 url。所以 localhost/Comments/ShowAllFor/2345345 如果你想让 SEO 有一个美好的一天会更好。
  • 感谢您的建议...将尝试这些
【解决方案2】:

答案:

  1. 试试return Json(comments, JsonRequestBehavior.AllowGet); 不过默认行为是有充分理由的。
  2. 对于任何通过网络传输的东西,您将真正想要创建一个非常简单的视图模型对象,而不是通过网络发送您的域实体。正如您所发现的,在 EntityFramework 中发生了许多不适用于序列化的奇特事情。

【讨论】:

  • 那么这背后的逻辑是什么?为什么默认设置不允许我执行 GET?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多