C# 我在另一个viewmodel中有一个viewmodel列表。如何将参数从动作传递到控制器?
我有一个ViewModel,其中包含另一个ViewModel的列表。我想把参数传递给我的控制器。我可以传递所有viewmodel参数,但我的第二个viewmodel列表为空 这是我的viewmodel:C# 我在另一个viewmodel中有一个viewmodel列表。如何将参数从动作传递到控制器?,c#,asp.net-mvc,checkbox,C#,Asp.net Mvc,Checkbox,我有一个ViewModel,其中包含另一个ViewModel的列表。我想把参数传递给我的控制器。我可以传递所有viewmodel参数,但我的第二个viewmodel列表为空 这是我的viewmodel: public class Provider_Coupon_FullViewModel { public int pid { get; set; } public int cid { get; set; } public int crid { get; set; }
public class Provider_Coupon_FullViewModel {
public int pid { get; set; }
public int cid { get; set; }
public int crid { get; set; }
public string opr_user { get; set; }
public List<PackageDetailsViewModel> PackageDetails { get; set; }
}
public class PackageDetailsViewModel {
public int packages_id { get; set; }
public string package_title { get; set; }
}
公共类提供者\u优惠券\u FullViewModel{
公共int-pid{get;set;}
公共int-cid{get;set;}
公共int-crid{get;set;}
公共字符串opr_用户{get;set;}
公共列表包详细信息{get;set;}
}
公共类PackageDetailsViewModel{
公共int包\u id{get;set;}
公共字符串包_title{get;set;}
}
这是我的剃须刀页面:
@model IList<myproject.Provider_Coupon_FullViewModel>
@using (Html.BeginForm())
{
for (var i = 0; i < Model.Count; i++)
{
<div class="form-horizontal col-lg-12 col-md-12 col-sm-12 col-xs-12">
@Html.EditorFor(Model => Model[i].pid)
@Html.EditorFor(Model => Model[i].cid)
@Html.EditorFor(Model => Model[i].crid)
/// I want show checkbox for list of viewmodel and pass value of them if check box checked
@for (int j = 0; j < Model[i].PackageDetails.Count; j++)
{
<div class="col-lg-3 col-md-3 col-sm-3 col-xs-3 FormBox">
<input type="checkbox" id=@Model[i].PackageDetails[j].packages_id name=@Model[i].PackageDetails[j].package_title value=@Model[i].PackageDetails[j].packages_id class="check">
<label for="@Model[i].PackageDetails[j].packages_id">@Model[i].PackageDetails[j].package_title</label>
</div>
}
@for (int j = 0; j < Model[i].PackageDetails.Count; j++)
{
<div class="col-lg-3 col-md-3 col-sm-3 col-xs-3 FormBox">
<input type="checkbox" id=@Model[i].PackageDetails[j].packages_id name=@Model[i].PackageDetails[j].package_title value=@Model[i].PackageDetails[j].packages_id class="check">
<label for="@Model[i].PackageDetails[j].packages_id">@Model[i].PackageDetails[j].package_title</label>
</div>
}
</div>
}
}
@model-IList
@使用(Html.BeginForm())
{
对于(var i=0;iModel[i].pid)
@EditorFor(Model=>Model[i].cid)
@EditorFor(Model=>Model[i].crid)
///我想显示viewmodel列表的复选框,并在选中复选框时传递它们的值
@对于(int j=0;j
您应该让MVC使用Html.CheckBoxFor(m=>…)
来处理复选框,而不是自己呈现复选框。MVC将生成与解析发布数据时所需的完全匹配的表单元素名称,这对于您自己来说是非常困难的
此外,要以这种方式呈现复选框,您需要在ViewModel中具有bool
属性,但缺少该属性
下面是工作代码(实际测试)
(在我们继续之前,还有一件更重要的事情:不要像上面的注释所说的那样使用foreach
。原因:如果使用for
+[index],MVCCheckBoxFor()
只生成正确的元素名(MVC可以再次解析)在ViewModel的所有级别上,如果在任何级别上使用foreach
,这种能力都会崩溃。MVC需要并使用这些索引号。)
控制器:
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
namespace Test_MVC.Controllers
{
public class TestController : Controller
{
[HttpGet]
public ActionResult Index()
{
// Create some data for initial display
var packageModels1 = new[] {
new PackageDetailsViewModel { packages_id = 101, package_title = "Order 101", is_selected = false },
new PackageDetailsViewModel { packages_id = 102, package_title = "Order 102", is_selected = true },
new PackageDetailsViewModel { packages_id = 103, package_title = "Order 103", is_selected = false }
};
var packageModels2 = new[] {
new PackageDetailsViewModel { packages_id = 201, package_title = "Order 201", is_selected = false },
new PackageDetailsViewModel { packages_id = 202, package_title = "Order 202", is_selected = false }
};
var couponModels = new[] {
new Provider_Coupon_FullViewModel { cid = 1, crid = 2, opr_user = "John", pid = 4, PackageDetails = packageModels1.ToList() },
new Provider_Coupon_FullViewModel { cid = 7, crid = 8, opr_user = "Beth", pid = 6, PackageDetails = packageModels2.ToList() }
};
return View(couponModels.ToList());
}
[HttpPost]
public ActionResult Index(List<Provider_Coupon_FullViewModel> model)
{
// Pass whatever was posted & parsed right back into the view for verification
return View(model);
}
}
}
public class Provider_Coupon_FullViewModel
{
public int pid { get; set; }
public int cid { get; set; }
public int crid { get; set; }
public string opr_user { get; set; }
public List<PackageDetailsViewModel> PackageDetails { get; set; }
}
public class PackageDetailsViewModel
{
public int packages_id { get; set; }
public string package_title { get; set; }
public bool is_selected { get; set; } /////// <--- BOOL PROPERTY <--- ///////
}
@model IList<Provider_Coupon_FullViewModel>
@using (Html.BeginForm())
{
for (var i = 0; i < Model.Count; i++)
{
<div style="border: dashed 1px blue; margin: 5px; padding: 5px">
pid: @Html.EditorFor(Model => Model[i].pid)<br />
cid: @Html.EditorFor(Model => Model[i].cid)<br />
crid: @Html.EditorFor(Model => Model[i].crid)<br />
@*I want show checkbox for list of viewmodel and pass value of them if check box checked*@
@for (int j = 0; j < Model[i].PackageDetails.Count; j++)
{
<div class="">
i = @i / j = @j / ID: @Html.DisplayFor(m => Model[i].PackageDetails[j].packages_id) / Title: @Html.DisplayFor(m => Model[i].PackageDetails[j].package_title) /
@Html.CheckBoxFor(m => Model[i].PackageDetails[j].is_selected)
@Html.LabelFor(m => Model[i].PackageDetails[j].is_selected)
</div>
}
</div>
}
<input type="submit" value="Submit" />
}
使用System.Collections.Generic;
使用System.Linq;
使用System.Web.Mvc;
名称空间测试\u MVC.Controllers
{
公共类TestController:控制器
{
[HttpGet]
公共行动结果索引()
{
//为初始显示创建一些数据
var packageModels1=new[]{
新PackageDetailsViewModel{packages_id=101,package_title=“Order 101”,is_selected=false},
新PackageDetailsViewModel{packages\u id=102,package\u title=“Order 102”,is\u selected=true},
新PackageDetailsViewModel{packages\u id=103,package\u title=“Order 103”,is\u selected=false}
};
var packageModels2=new[]{
新PackageDetailsViewModel{packages\u id=201,package\u title=“Order 201”,is\u selected=false},
新PackageDetailsViewModel{packages\u id=202,package\u title=“Order 202”,is\u selected=false}
};
var couponModels=new[]{
新提供程序\u优惠券\u FullViewModel{cid=1,crid=2,opr\u user=“John”,pid=4,PackageDetails=packageModels1.ToList(),
新提供程序\u优惠券\u FullViewModel{cid=7,crid=8,opr\u user=“Beth”,pid=6,PackageDetails=packageModels2.ToList()}
};
返回视图(couponModels.ToList());
}
[HttpPost]
公共行动结果索引(列表模型)
{
//将发布和解析的内容传递回视图进行验证
返回视图(模型);
}
}
}
视图模型类:
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
namespace Test_MVC.Controllers
{
public class TestController : Controller
{
[HttpGet]
public ActionResult Index()
{
// Create some data for initial display
var packageModels1 = new[] {
new PackageDetailsViewModel { packages_id = 101, package_title = "Order 101", is_selected = false },
new PackageDetailsViewModel { packages_id = 102, package_title = "Order 102", is_selected = true },
new PackageDetailsViewModel { packages_id = 103, package_title = "Order 103", is_selected = false }
};
var packageModels2 = new[] {
new PackageDetailsViewModel { packages_id = 201, package_title = "Order 201", is_selected = false },
new PackageDetailsViewModel { packages_id = 202, package_title = "Order 202", is_selected = false }
};
var couponModels = new[] {
new Provider_Coupon_FullViewModel { cid = 1, crid = 2, opr_user = "John", pid = 4, PackageDetails = packageModels1.ToList() },
new Provider_Coupon_FullViewModel { cid = 7, crid = 8, opr_user = "Beth", pid = 6, PackageDetails = packageModels2.ToList() }
};
return View(couponModels.ToList());
}
[HttpPost]
public ActionResult Index(List<Provider_Coupon_FullViewModel> model)
{
// Pass whatever was posted & parsed right back into the view for verification
return View(model);
}
}
}
public class Provider_Coupon_FullViewModel
{
public int pid { get; set; }
public int cid { get; set; }
public int crid { get; set; }
public string opr_user { get; set; }
public List<PackageDetailsViewModel> PackageDetails { get; set; }
}
public class PackageDetailsViewModel
{
public int packages_id { get; set; }
public string package_title { get; set; }
public bool is_selected { get; set; } /////// <--- BOOL PROPERTY <--- ///////
}
@model IList<Provider_Coupon_FullViewModel>
@using (Html.BeginForm())
{
for (var i = 0; i < Model.Count; i++)
{
<div style="border: dashed 1px blue; margin: 5px; padding: 5px">
pid: @Html.EditorFor(Model => Model[i].pid)<br />
cid: @Html.EditorFor(Model => Model[i].cid)<br />
crid: @Html.EditorFor(Model => Model[i].crid)<br />
@*I want show checkbox for list of viewmodel and pass value of them if check box checked*@
@for (int j = 0; j < Model[i].PackageDetails.Count; j++)
{
<div class="">
i = @i / j = @j / ID: @Html.DisplayFor(m => Model[i].PackageDetails[j].packages_id) / Title: @Html.DisplayFor(m => Model[i].PackageDetails[j].package_title) /
@Html.CheckBoxFor(m => Model[i].PackageDetails[j].is_selected)
@Html.LabelFor(m => Model[i].PackageDetails[j].is_selected)
</div>
}
</div>
}
<input type="submit" value="Submit" />
}
公共类提供者\u优惠券\u FullViewModel
{
公共int-pid{get;set;}
公共int-cid{get;set;}
公共int-crid{get;set;}
公共字符串opr_用户{get;set;}
公共列表包详细信息{get;set;}
}
公共类PackageDetailsViewModel
{
公共int包\u id{get;set;}
公共字符串包_title{get;set;}
公共布尔被选中{get;set;}///Model[i].cid)
crid:@Html.EditorFor(Model=>Model[i].crid)
@*我想显示viewmodel列表的复选框,并在选中复选框时传递它们的值*@
@对于(int j=0;jModel[i]。PackageDetails[j]。packageid)/Title:@Html.DisplayFor(m=>Model[i]。PackageDetails[j]。package\u Title)/
@Html.CheckBoxFor(m=>Model[i].PackageDetails[j]。是否选中)
@Html.LabelFor(m=>Model[i].PackageDetails[j]。是否选中)
}
}
}
您应该让MVC使用Html.CheckBoxFor(m=>…)
来处理复选框,而不是自己呈现复选框。MVC将生成与解析发布数据时所需的完全匹配的表单元素名称,这对于您自己来说是非常困难的
此外,要以这种方式呈现复选框,您需要在ViewModel中具有bool
属性,但缺少该属性
下面是工作代码(实际测试)
(在我们继续之前,还有一件更重要的事情:不要像上面的评论所说的那样使用foreach
。原因:MVCCheckBoxFor()
如果在ViewModel的所有级别上都使用for
+[index],那么它只会生成正确的元素名(可以由MVC再次解析),而这种能力将