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

本文关键字:复选框 控制器 MVC 提交 ASP | 更新日期: 2023-09-27 18:16:02

我在做ASP。. NET MVC web应用程序,我需要使用checkbox s提交List<ProdColor>Controller。这是我的代码

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; }
}
控制器

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");
}
<<p> 视图/strong>
@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" />
}

问题是当提交复选框而没有选择第一个时,List<ProdColor>的值变成了Null。那么我应该如何得到正确的值在Controller .

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

您手动创建带有索引的复选框。未选中的复选框不会返回值,因此如果任何复选框未选中,则会得到非连续索引器,因此模型绑定失败。

你的模型(视图模型)需要包含一个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)
}

CheckBoxFor()方法生成一个带有value="true"的复选框和一个与value="false"相关的隐藏输入。如果选中复选框,则同时发布truefalse,但只绑定第一个值(true)。如果复选框未选中,则只发布false

然后在POST方法中,您可以使用(例如)

获取所选项目的ID
var selectedColors = product.ColorList.Where(c => c.IsSelected).Select(c => c.Color_id);

请注意,您不需要在List<ProdColor> ProductColors的POST方法中添加参数,因为参数ProdctModelView product已经包含了所有这些值。