如何在ASP.NET MVC中向控制器正确提交复选框值

mar*_*sam 2 c# checkbox asp.net-mvc razor asp.net-mvc-4

我工作的ASP.NET MVC的Web应用程序,我需要提交List<ProdColor>Controllercheckbox秒.这是我的代码

模型

public partial class ProdColor
{
    public int ProdColor_ID { get; set; }
    public Nullable<int> P_ID { get; set; }
    public Nullable<int> Color_ID { get; set; }

    public virtual ProdctModelView ProdctModelView { get; set; }
}

public class ProdctModelView
{
    public ProdctModelView()
    {
        this.ProductColors = new HashSet<ProdColor>();
    }

    public int P_ID { get; set; }
    public string P_name { get; set; }

    public virtual ICollection<ProdColor> ProductColors { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

调节器

public ActionResult Create()
{
    ViewBag.colorlist = db.Colors.OrderBy(m => m.Color_name).ToList();
    return View();
}

[HttpPost]
public ActionResult Create(ProdctModelView product, List<ProdColor> ProductColors)
{
    Product prod = new Product();
    //Save new product
    db.Products.Add(prod);
    db.SaveChanges();

    foreach (var color in ProductColors)
    {        
        color.P_ID = prod.P_ID;
        db.ProdColors.Add(color);
     }
     db.SaveChanges();
     return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)

视图

@model mvc4test.Models.ProdctModelView
@using (Html.BeginForm("Create", "CP_Product", FormMethod.Post))
{

    @for (int i = 0; i < ViewBag.colorlist.Count; i++)
    {                      
        <input type="checkbox" id="@ViewBag.colorlist[i].Color_name" name="[@i].Color_ID" value="@ViewBag.colorlist[i].Color_id"/>
    }
    <input type="submit" value="Save" />
}
Run Code Online (Sandbox Code Playgroud)

问题是提交的复选框不选择当第一一个,的值List<ProdColor>成为Null.那么我应该如何获得正确的值Controller.

小智 11

您使用索引器手动创建复选框.未选中的复选框不会回发值,因此如果未选中任何复选框,则会获得非连续的索引器,因此模型绑定失败.

您的模型(视图模型)需要包含一个boolean属性(比如说),public bool IsSelected { get; set; }以便在视图中您可以使用该@Html.CheckBoxFor()方法强烈绑定到您的模型.

@for (int i = 0; i < Model.ColorList.Count; i++)
{
    @Html.HiddenFor(m => m.ColorList[i].Color_id)
    @Html.CheckBoxFor(m => m.ColorList[i].IsSelected)
    @Html.LabelFor(m => m.ColorList[i].IsSelected, Model.ColorList[i].Color_name)
}
Run Code Online (Sandbox Code Playgroud)

CheckBoxFor()方法生成一个复选框,value="true"其中包含相关的隐藏输入value="false".如果复选框被选中,都truefalse张贴,但只有第一个(true)的值约束.如果取消选中该复选框,则仅false发布该复选框.

然后在POST方法中,您可以使用(例如)获取所选项目的ID

var selectedColors = product.ColorList.Where(c => c.IsSelected).Select(c => c.Color_id);
Run Code Online (Sandbox Code Playgroud)

请注意,在POST方法中不需要参数,List<ProdColor> ProductColors因为参数ProdctModelView product已包含所有这些值.