Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我在另一个viewmodel中有一个viewmodel列表。如何将参数从动作传递到控制器?_C#_Asp.net Mvc_Checkbox - Fatal编程技术网

C# 我在另一个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; }

我有一个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 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],MVC
CheckBoxFor()
只生成正确的元素名(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
。原因:MVC
CheckBoxFor()
如果在ViewModel的所有级别上都使用
for
+[index],那么它只会生成正确的元素名(可以由MVC再次解析),而这种能力将