【问题标题】:How to return Json as part of my view in C# MVC如何在 C# MVC 中返回 Json 作为我的视图的一部分
【发布时间】:2013-04-25 10:52:46
【问题描述】:

我的问题是:如何将这两个动作结果合并为一个? 让第一个只做一行似乎没有意义。但我看不到出路。任何想法,将不胜感激。剩下的我提供背景。

我正在尝试并成功返回带有我需要的 Json 结果的部分视图,但我使用两个同名的 ActionResult(一个带有参数一个没有)来实现这一点。如果我以这种方式继续,我将不得不重复我所有的 ActionResults 两次。我遇到的问题是,第一个操作结果只不过是字面意思:

[HttpGet]
public ActionResult MyResults()
{
    return PartialView();
}

用于返回视图。在视图中,我有一些 JQuery/Ajax,它们依次调用另一个同名但带有参数的操作结果。此操作结果有效地填充了一个 Json 对象,然后将其解析并作为表格呈现到上面的视图中。这个 actionresult 有效地完成了所有工作。它看起来像:

    [HttpPost]
    public ActionResult MyResults(DataTablePrameters param)
    {
         //Get the full list of data that meets our needs
        var fullList = _myResultsRepository.GetListByID(Id);

        //Count the records in the set
        int count = fullList.Count();

        //Shorten the data to that required for the page and put into object array for Json
        var result = from r in fullList.Skip(param.iDisplayStart).Take(param.iDisplayLength)
                     select new object[]
                     {
                         r.field1,
                         r.field2,
                         r.field3
                     };

        //Return Json data for the Datatable
        return Json(new
        {
            sEcho = param.sEcho,
            iTotalRecords = param.iDisplayLength,
            iTotalDisplayRecords = count,
            aaData = result
        });
    }

那些不熟悉它的人不会知道我正在使用 DI/IOC,并且为简洁起见,我没有包含详细信息。但这不是我的问题。上面的代码也使用了来自以下站点的数据表:

http://datatables.net/index

实际上相当不错。再次,使用以上所有内容,我的代码运行良好。所以我没有问题。我知道它的效率有点低,因为它将结果集加载到一个变量中进行计数,然后跳过...采取等等,但它再次起作用,这不是我的问题。

所以我唯一的问题是,我怎样才能将它们两个合并到一个视图中。让第一个只做一条线似乎没有意义。但我看不到出路。任何想法将不胜感激。

【问题讨论】:

  • 我想在未来向读者解释,这个问题会误导人们回答假设我错误地想要删除 HttpPost/Get 属性,这不是我的意图,也不是我的建议。所以我的代码实际上是正确的方法。虽然我确实得到了一个基于接受的答案的解决方案。建议读者仔细研究这样做的安全问题。正如公认的答案所建议的那样,最好保持原样,因为它可以防止打开您必须编程才能修复的安全漏洞。本质上为什么要修复未损坏的内容。

标签: c# asp.net-mvc json linq jquery-datatables


【解决方案1】:

从您要使用的ActionResult 中删除[HttpPost][HttpGet] 属性。

检查DataTablePrameters param 中包含的字段的有效性,例如:

public ActionResult MyResults(DataTablePrameters param = null) {
    if(string.IsNullOrEmpty(param.sEcho) && string.IsNullOrEmpty(param.iDisplayStart) && string.IsNullOrEmpty(param.iDisplayLength))
        return PartialView();

//Do something

return Json(...);
}

在您看来,您仍然可以将type:"POST"url:"/YourController/MyResults" 一起使用到您的$.ajax() 中,就像您已经做的那样。

【讨论】:

  • 执行此操作时出现以下错误:“此请求已被阻止,因为在 GET 请求中使用此信息时可能会将敏感信息泄露给第三方网站。要允许 GET 请求,将 JsonRequestBehavior 设置为 AllowGet。”我检查了它,并添加了它,但它并没有改变任何东西。还有一些安全问题让我按照消息建议启用 AllowGet。你能建议任何替代方案吗?谢谢你的回答。
  • 我的建议是,使用 JsonRequestBehavior.AllowGet 使您的应用程序正常工作并保护它,对包含关键数据的页面使用 HTTPS。
  • 如其他答案所述。我的问题确实误导人们认为我想删除 HttpPost/Get。我忘记了他们的目的,作为另一个问题的一部分,我不想修改太多代码来进行分页。问题是,如果我要按照你在这里建议的路线走,无论如何我都必须修改很多东西。因此,出于这个原因,我发现另一个答案更有帮助,因此接受了它。但是,感谢您的帮助 +1。
【解决方案2】:

假设只剩下一个操作就不需要分离 POST 和 GET 访问,难道只是让“param”可选吗?

public ActionResult MyResults(DataTablePrameters param = null) {
  if(param == null)
    return PartialView();

  // Repository action...

  return Json([...]);
}

【讨论】:

  • 我非常不喜欢人们在不提供解释的情况下投票否决问题或答案,所以我投票支持你。执行此操作时出现以下错误:“此请求已被阻止,因为敏感信息可能会在 GET 请求中使用时泄露给第三方网站。要允许 GET 请求,请将 JsonRequestBehavior 设置为 AllowGet。”我检查了它,并添加了它,但它并没有改变任何东西。还有一些安全问题让我按照消息建议启用 AllowGet。你能建议任何替代方案吗?谢谢你的回答。
  • 添加 JsonRequestBehavior.AllowGet 应该会有所帮助。我的测试代码和上面一样,只是将param的类型改为String,最后一行返回Json(new { Value = param }, JsonRequestBehavior.AllowGet),运行无误。关于安全性:当然,JsonResult 默认情况下不允许 GET 是有原因的。您可以在返回 JsonResult 之前检查 Request.HttpMethod 以确保 POST。
  • 诚然,我提供的解决方案可能看起来并不完全干净,并且可能存在一些问题,也许在原始答案中已经得到了最好的解决。就个人而言,我不介意您原始解决方案中的不同操作,出于几个原因,我会坚持使用它们,可维护性是一个,关注点分离是另一个,但我不想判断您在有限信息下尝试的内容。我同意,如果有人认为我的方法不好,他们应该让我知道原因,这样我才能更好地做自己。感谢您投票支持我。
  • 我同意。我的问题可能鼓励删除 HttpPost/Get 属性。实际上,我完全忘记了它们在 MVC 中的使用,所以你是对的,我不应该将它们结合起来。当我将它们分开时,一切正常,而不是您提醒我它们的重要性,我明白为什么。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多