C# ASP.NET MVC发送列表<;Foo>;从我的视图到控制器的集合
我在ASP.NET中有一个应用程序,我想将此对象列表传递给我的控制器。现在应用程序正在做的是通过sql查询填充列表,然后将所述列表加载到视图中。接下来,我根据得到的数据将列表分为4个颜色类别:红色、蓝色、绿色和黄色(分别)。我在4C# ASP.NET MVC发送列表<;Foo>;从我的视图到控制器的集合,c#,ajax,asp.net-mvc,C#,Ajax,Asp.net Mvc,我在ASP.NET中有一个应用程序,我想将此对象列表传递给我的控制器。现在应用程序正在做的是通过sql查询填充列表,然后将所述列表加载到视图中。接下来,我根据得到的数据将列表分为4个颜色类别:红色、蓝色、绿色和黄色(分别)。我在4上显示每一个的计数。每个div都是自己的ActionLink,现在向控制器发送一个包含颜色名称的字符串 然后,控制器获取字符串并将其与查询进行比较,在查询中返回属于该颜色类别的列表对象;然后我想做什么就做什么 但我的问题是,我不得不一次又一次地进行数据拉取,而且这样做需
上显示每一个的计数。每个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
循环会给我们提供一个索引变量,我们使用它来告诉表单哪对值属于一起。还要注意,我实际上在它上面创建了一个tempvar 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
循环会给我们提供一个索引变量,我们使用它来告诉表单哪对值属于一起。还要注意,我实际上在它上面创建了一个tempvar 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”}
donew{Foo=Model.FooCollection(x=>x.color==“green”}
您没有对正在传递的参数执行任何操作。您能更好地解释一下吗?@StormHash当然,现在我所做的只是传递一个字符串。然后,我将此sitring传递给另一个控制器,它执行与我的第一个控制器完全相同的操作。唯一的例外是它同时执行