Asp.net mvc 如何将单个元素从列表传递到控制器

Asp.net mvc 如何将单个元素从列表传递到控制器,asp.net-mvc,Asp.net Mvc,我的viewModel中有一个对象列表,如下所示: 公共类业务服务可视模型 { 公共列表服务{get;set;} 公共服务视图模型新闻服务{get;set;} } 我想编辑视图中此列表中的单个元素: (i=0;im.Services[i].Name) @Html.TextBoxFor(m=>m.Services[i].Name,新{@class=“form control”}) @LabelFor(m=>m.Services[i].Duration) @Html.TextBoxFor(m=>m

我的viewModel中有一个对象列表,如下所示:

公共类业务服务可视模型
{
公共列表服务{get;set;}
公共服务视图模型新闻服务{get;set;}
}
我想编辑视图中此列表中的单个元素:

(i=0;im.Services[i].Name) @Html.TextBoxFor(m=>m.Services[i].Name,新{@class=“form control”}) @LabelFor(m=>m.Services[i].Duration) @Html.TextBoxFor(m=>m.Services[i].Duration,新的{@class=“form control”,type=“number”,min=“1”,max=“1440”}) @Html.HiddenFor(m=>m.Services[i].Id) 赞克尼 } 在控制器中,我这样做:

[Authorize(Roles=“Business”)]
公共操作结果编辑服务(BusinessServicesViewModel模型)
{
var userId=HttpContext.User.Identity.GetUserId();
BusinessServicesViewModelToReturn;
如果(!ModelState.IsValid)
{
modelToReturn=GetBusinessServicesViewModel(用户ID);
modelToReturn.NewService=model.NewService;
返回视图(“服务”,modelToReturn);
}
var user=_contex.Users.Include(u=>u.Business.Services).Single(u=>u.Id==userId);
var service=user.Business.Services.SingleOrDefault(s=>s.Id==model.Services[0].Id);
service.Duration=model.Services[0]。Duration;
service.Name=model.Services[0].Name;
如果(_contex.SaveChanges()>0)
[...]
}
对于列表中的第一个元素,这是有效的。Controller获取带有单个项的列表。我认为,该视图总是只传递表单中的一个项。这就是为什么我编写类似这样的内容:
service.Duration=model.Services[0]。Duration;

但对于其他项,控制器会得到空列表。看起来它希望通过索引传递项,例如3,但前面的索引不存在,所以总体上为空

我不想传递包含所有项的列表,因为它非常大,我只想传递一个元素。 我还想使用这个列表和
@Html.TextBoxFor
,因为它可以很好地用当前值填充textBox


那么,有没有办法通过一个项目来传递列表?或者我如何才能做得更好?

如果您只想编辑一个项目,您应该只传递一个项目(如果可能的话)

首先,将您的签名功能更改为处理单个服务模型:

[Authorize(Roles = "Business")]
public ActionResult EditService(ServiceViewModel model)

现在,为了让这项工作正常进行,您需要确保将正确的数据传递给表单。看起来您的表单数据和模型是匹配的,它会正常工作。如果不匹配,请告诉我。

谢谢,我还必须更改帮助器方法:
@Html.TextBoxFor(m=>m.Services[i].Name);
到原始Html