C# ASP.NET MVC发送列表<;Foo>;从我的视图到控制器的集合

C# ASP.NET MVC发送列表<;Foo>;从我的视图到控制器的集合,c#,ajax,asp.net-mvc,C#,Ajax,Asp.net Mvc,我在ASP.NET中有一个应用程序,我想将此对象列表传递给我的控制器。现在应用程序正在做的是通过sql查询填充列表,然后将所述列表加载到视图中。接下来,我根据得到的数据将列表分为4个颜色类别:红色、蓝色、绿色和黄色(分别)。我在4上显示每一个的计数。每个div都是自己的ActionLink,现在向控制器发送一个包含颜色名称的字符串 然后,控制器获取字符串并将其与查询进行比较,在查询中返回属于该颜色类别的列表对象;然后我想做什么就做什么 但我的问题是,我不得不一次又一次地进行数据拉取,而且这样做需

我在ASP.NET中有一个应用程序,我想将此对象列表传递给我的控制器。现在应用程序正在做的是通过sql查询填充列表,然后将所述列表加载到视图中。接下来,我根据得到的数据将列表分为4个颜色类别:红色、蓝色、绿色和黄色(分别)。我在4
上显示每一个的计数。每个div都是自己的ActionLink,现在向控制器发送一个包含颜色名称的字符串

然后,控制器获取字符串并将其与查询进行比较,在查询中返回属于该颜色类别的列表对象;然后我想做什么就做什么

但我的问题是,我不得不一次又一次地进行数据拉取,而且这样做需要的时间太长了。是否有一种方法可以让我只加载列表一次,然后将其传递给我的控制器,这样我就不会被困在等待查询完成加载了

这是我的型号

using System.Collections.Generic;

namespace Foo.Models
{
  public class FooViewModel
  {
    public List<Foo> FooCollection = new List<Foo>();
    /*Contains two properties
      string CarName {get; set;}
      string Color   {get; set;}
      List<Features> Features = new List<Features>();
    */
  }
}
public ActionResult Index()
{

   foreach (var car in db.database.Db_GetCars())
   {
      model.FooCollection.Add(new Foo()
      {
         CarName = car.CarName,
         Color= car.Color
      });
    }
    return View(model);
}  
目的地控制器:

    namespace Foo.Controllers
    {
      public class BarController: Controller
      {
        BarViewModel model = new BarViewModel();

[HttpPost, Route("/Bar/Index/{color}")]
        public ActionResult Index(List<Foo> Cars)
        {
          //logic goes here

          return View(model);
        }
      }
    }
名称空间Foo.Controllers
{
公共类控制器:控制器
{
BarViewModel模型=新的BarViewModel();
[HttpPost,路由(“/Bar/Index/{color}”)]
公共行动结果指数(列出车辆)
{
//逻辑就在这里
返回视图(模型);
}
}
}

我想要的输出是将完整的
列表
对象发送到我的目标控制器。但现在,当它到达控制器时,我得到的值计数为零(0)。有人能看出我做错了什么吗?非常感谢。

因此,您的主要问题是试图使用操作(链接、锚定标记)将列表传递给控制器。但是锚定标记是一个“Get”请求,您通常不会通过Get传递列表(是的,这是可能的,但通常不建议)。这将是更好的为您使用一个表单张贴这一点。以下是一个基本纲要:

<!-- red cars -->
<form action="/bar/index/red" method="post">

    @foreach(var car in Model.Where(c => c.Color == "red"))
    {
        <input type="hidden" name="carnames" value="@car.CarName" />
    }
    <button class="btn btn-primary" type="submit">Red Cars</button>

</form>

<!-- green cars -->
<form action="/bar/index/green" method="post">

    @foreach(var car in Model.Where(c => c.Color == "green"))
    {
        <input type="hidden" name="carnames" value="@car.CarName" />
    }
    <button class="btn btn-primary" type="submit">Green Cars</button>

</form>

<!-- blue cars -->
<form action="/bar/index/blue" method="post">

    @foreach(var car in Model.Where(c => c.Color == "blue"))
    {
        <input type="hidden" name="carnames" value="@car.CarName" />
    }
    <button class="btn btn-primary" type="submit">Blue Cars</button>

</form>

<!-- yeller cars -->
<form action="/bar/index/yellow" method="post">

    @foreach(var car in Model.Where(c => c.Color == "yellow"))
    {
        <input type="hidden" name="carnames" value="@car.CarName" />
    }
    <button class="btn btn-primary" type="submit">Yellow Cars</button>

</form>
切换到常规的
for
循环会给我们提供一个索引变量,我们使用它来告诉表单哪对值属于一起。还要注意,我实际上在它上面创建了一个temp
var cars=…
,这样我就可以在较小的列表中循环。现在,只需更改其他颜色以匹配此代码,并将控制器更改为接受
字符串颜色,列出车辆
,即可完成所有设置

编辑2: 如果要在ajax中执行此操作,请在javascript中创建一个对象:

var cars = [
    { 'CarName': 'name', 'Color': 'color' },
    { 'CarName': 'name', 'Color': 'color' },
    { 'CarName': 'name', 'Color': 'color' },
    { 'CarName': 'name', 'Color': 'color' },
    { 'CarName': 'name', 'Color': 'color' }
];
您可以使用jQuery以各种方式填充实际的
名称
颜色
。然后使用ajax post:

$(document).ready(function()
{
    $('#ajaxPost').click(function ()
    {
        $.ajax(
        {
            type: 'POST',
            url: '/stuff/cars',
            contentType: "application/json",
            data: JSON.stringify(cars),
            success: function (data)
            {
                // do stuff
            },
            error: function (e)
            {
                alert(e);

            }

        });
    });
});
注意:这将是控制器中与前一个端点不同的端点。根据您使用的.net版本的不同,情况会略有不同

新控制器操作:

[HttpPost, Route("stuff/cars/")]
public IActionResult Cars2([FromBody] List<FooViewModel> cars)
{
    // do stuff...

    return View();
}
[HttpPost,路线(“stuff/cars/”)
公共IActionResult车辆2([FromBody]列出车辆)
{
//做些事情。。。
返回视图();
}

注意
[FromBody]
标记,这在.NETCore中是必需的,ajax调用中的
JSON.stringify
也是如此。如果您不确定自己使用的是哪个版本,请交替添加/删除其中的每个版本。Core可能有点挑剔…

所以您的主要问题是您试图使用一个操作(链接、锚定标记)将列表传递给控制器。但是锚定标记是一个“Get”请求,您通常不会通过Get传递列表(是的,这是可能的,但通常不建议)。这将是更好的为您使用一个表单张贴这一点。以下是一个基本纲要:

<!-- red cars -->
<form action="/bar/index/red" method="post">

    @foreach(var car in Model.Where(c => c.Color == "red"))
    {
        <input type="hidden" name="carnames" value="@car.CarName" />
    }
    <button class="btn btn-primary" type="submit">Red Cars</button>

</form>

<!-- green cars -->
<form action="/bar/index/green" method="post">

    @foreach(var car in Model.Where(c => c.Color == "green"))
    {
        <input type="hidden" name="carnames" value="@car.CarName" />
    }
    <button class="btn btn-primary" type="submit">Green Cars</button>

</form>

<!-- blue cars -->
<form action="/bar/index/blue" method="post">

    @foreach(var car in Model.Where(c => c.Color == "blue"))
    {
        <input type="hidden" name="carnames" value="@car.CarName" />
    }
    <button class="btn btn-primary" type="submit">Blue Cars</button>

</form>

<!-- yeller cars -->
<form action="/bar/index/yellow" method="post">

    @foreach(var car in Model.Where(c => c.Color == "yellow"))
    {
        <input type="hidden" name="carnames" value="@car.CarName" />
    }
    <button class="btn btn-primary" type="submit">Yellow Cars</button>

</form>
切换到常规的
for
循环会给我们提供一个索引变量,我们使用它来告诉表单哪对值属于一起。还要注意,我实际上在它上面创建了一个temp
var cars=…
,这样我就可以在较小的列表中循环。现在,只需更改其他颜色以匹配此代码,并将控制器更改为接受
字符串颜色,列出车辆
,即可完成所有设置

编辑2: 如果要在ajax中执行此操作,请在javascript中创建一个对象:

var cars = [
    { 'CarName': 'name', 'Color': 'color' },
    { 'CarName': 'name', 'Color': 'color' },
    { 'CarName': 'name', 'Color': 'color' },
    { 'CarName': 'name', 'Color': 'color' },
    { 'CarName': 'name', 'Color': 'color' }
];
您可以使用jQuery以各种方式填充实际的
名称
颜色
。然后使用ajax post:

$(document).ready(function()
{
    $('#ajaxPost').click(function ()
    {
        $.ajax(
        {
            type: 'POST',
            url: '/stuff/cars',
            contentType: "application/json",
            data: JSON.stringify(cars),
            success: function (data)
            {
                // do stuff
            },
            error: function (e)
            {
                alert(e);

            }

        });
    });
});
注意:这将是控制器中与前一个端点不同的端点。根据您使用的.net版本的不同,情况会略有不同

新控制器操作:

[HttpPost, Route("stuff/cars/")]
public IActionResult Cars2([FromBody] List<FooViewModel> cars)
{
    // do stuff...

    return View();
}
[HttpPost,路线(“stuff/cars/”)
公共IActionResult车辆2([FromBody]列出车辆)
{
//做些事情。。。
返回视图();
}

注意
[FromBody]
标记,这在.NETCore中是必需的,ajax调用中的
JSON.stringify
也是如此。如果您不确定自己使用的是哪个版本,请交替添加/删除其中的每个版本。Core可能有点挑剔…

您没有对所传递的参数做任何操作。你能解释得更清楚些吗?@stormhash当然,现在我所做的只是传递一个字符串。然后,我将这个坐姿传递给另一个控制器,该控制器执行与第一个控制器完全相同的操作。除了它根据我传递的颜色压缩列表之外。请参阅上面的Destination Controller下的代码。我要查找的是如何构造视图,以发送列表对象。缓存是关键字here@SamiKuhmonen我是ASP.NET的新手,想详细说明一下吗?你能将方法签名设置为
public ActionResult Index(Foo cars)
并在操作链接中而不是
new吗{id=“color”}
do
new{Foo=Model.FooCollection(x=>x.color==“green”}
您没有对正在传递的参数执行任何操作。您能更好地解释一下吗?@StormHash当然,现在我所做的只是传递一个字符串。然后,我将此sitring传递给另一个控制器,它执行与我的第一个控制器完全相同的操作。唯一的例外是它同时执行