如何在C#MVC中返回Json作为我视图的一部分

如何在C#MVC中返回Json作为我视图的一部分,c#,asp.net-mvc,json,linq,jquery-datatables,C#,Asp.net Mvc,Json,Linq,Jquery Datatables,我的问题是:如何将这两个操作结果合并为一个?让第一个操作结果只执行一行似乎没有任何意义。但我看不到出路。任何想法都将不胜感激。剩下的我提供背景资料 我正在尝试并成功地返回一个包含所需Json结果的部分视图,但我使用了两个同名的ActionResults(一个带有参数,一个没有参数)来实现这一点。如果我继续这样做,我将不得不重复我所有的行动结果两次。我遇到的问题是,第一个动作结果只不过是字面上的: [HttpGet] public ActionResult MyResults() { re

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

我正在尝试并成功地返回一个包含所需Json结果的部分视图,但我使用了两个同名的ActionResults(一个带有参数,一个没有参数)来实现这一点。如果我继续这样做,我将不得不重复我所有的行动结果两次。我遇到的问题是,第一个动作结果只不过是字面上的:

[HttpGet]
public ActionResult MyResults()
{
    return PartialView();
}
用于返回视图的。在视图中,我有一些JQuery/Ajax,它反过来调用另一个同名但带有参数的操作结果。此操作结果有效地填充了一个Json对象,然后将其解析并作为表呈现到上面的视图中。这一行动结果有效地完成了所有工作。它看起来像:

    [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,为了简单起见,我没有包括这方面的细节。但这不是我的问题。上述代码还使用了来自以下站点的数据表:

其实都很好。同样,使用以上所有功能,我的代码运行良好。所以我没有问题。我知道这有点低效,因为它将结果集加载到一个变量中进行计数,然后跳过…获取等等,但它仍然有效,这不是我的问题


因此,我唯一的问题是,如何将这两个视图组合成一个视图。让第一个只做一行似乎毫无意义。但我看不到出路。如果您有任何想法,我们将不胜感激。

假设在只剩下一个操作的情况下不需要将POST和GET access分离,那么将“param”设置为可选不就可以了吗

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

  // Repository action...

  return Json([...]);
}

从要使用的
操作结果
中删除
[HttpPost]
[HttpGet]
属性

检查
DataTablePrameters参数中包含的字段的有效性,如:

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(...);
}

在您看来,您仍然可以使用
类型:“POST”
$.ajax()
中,并使用
url:“/YourController/MyResults”
,就像您已经在做的那样。执行此操作时,我收到以下错误:“此请求已被阻止,因为在GET请求中使用此请求时,可能会向第三方网站披露敏感信息。要允许GET请求,请将JsonRequestBehavior设置为AllowGet。“我检查了它,并添加了它,但它没有改变任何事情。此外,还有一些安全问题困扰着我启用AllowGet,正如消息所建议的那样。你能提出其他的建议吗。感谢您的回答。我的建议是,使用JsonRequestBehavior.AllowGet使您的应用程序工作并确保其安全,对包含关键数据的页面使用HTTPS。如另一个答案所述。我的问题确实误导了人们,使他们认为我想删除HttpPost/Get。我忘记了它们的用途,作为另一个问题的一部分,我不想修改太多代码来进行分页。问题是,如果我要走你在这里建议的路线,我将不得不修改很多东西。因此,出于这个原因,我发现另一个答案更有用,所以接受了它。但是,+1表示感谢你的帮助。我非常不喜欢人们在没有解释的情况下否决问题或答案,所以我投票支持你。在执行此操作时,我遇到以下错误:“此请求已被阻止,因为在GET请求中使用此请求时,可能会向第三方网站披露敏感信息。若要允许GET请求,请将JsonRequestBehavior设置为AllowGet。”我签出并添加了它,但它不会改变任何内容。此外,还有一些安全问题困扰着我启用AllowGet,正如消息所建议的那样。你能提出其他的建议吗。谢谢你的回答。添加JsonRequestBehavior.AllowGet应该会有所帮助。我的测试代码与上面的代码相同,只是将param的类型更改为String,并将最后一行更改为返回Json(new{Value=param},JsonRequestBehavior.AllowGet),它运行时没有错误。关于安全性:当然,JsonResult在默认情况下不允许GET是有原因的。在返回JsonResult之前,您可以检查Request.HttpMethod以确保POST。诚然,我提供的解决方案看起来可能不是绝对干净的,并且可能存在一些问题,也许最好在原始答案中已经解决了。就个人而言,我不介意您最初的解决方案中的不同操作,我会坚持使用它们,原因有几个,可维护性是一个原因,关注点分离是另一个原因,但我不想用有限的信息来判断您在尝试什么。我同意,如果有人认为我的方法不好,他们应该让我知道原因,这样我就可以改进自己。谢谢你投票支持我,我同意。我的问题可能鼓励删除HttpPost/Get属性。事实上,我完全忘记了它们在MVC中的使用,所以你是对的,我不应该将它们结合起来。当我把它们分开时,一切都起作用了,而不是你提醒我它们的重要性,我明白为什么。感谢您的帮助。我想在将来向读者解释,这个问题实际上误导了回答的人,让他们以为我错误地想要删除HttpPost/Get属性,这不是我的意图,也不是我的建议。所以我的代码实际上是正确的方法。而我确实得到了一个基于被接受答案的解决方案。建议读者仔细研究这样做的安全问题。正如公认的答案所建议的那样,最好保持现状,因为这样可以防止打开安全漏洞,而您必须通过编程来修复这些漏洞。本质上,为什么要修复没有损坏的东西。