2015-10-03 31 views
2

我正在研究ASP.NET MVC Web應用程序,並且需要使用checkbox來提交List<ProdColor>Controller。這裏是我的代碼如何在ASP.NET MVC中正確提交複選框值給控制器

型號

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"); 
} 

查看

@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" /> 
} 

的概率lem是在提交複選框時未選擇第一個一,List<ProdColor>的值變爲Null。那麼我應該如何在Controller上得到正確的值。

+0

歡迎來到SO。這個存在的問題對你有幫助嗎? http://stackoverflow.com/questions/220020/how-to-handle-checkboxes-in-asp-net-mvc-forms?rq=1 – Fabske

回答

8

您使用索引器手動創建複選框。未勾選的複選框不回發一個值,因此如果任何複選框未選中,您將獲得非連續的索引器,因此模型綁定失敗。

你的模型(視圖模型)需要包括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); 

注意,你並不需要一個參數在POST方法List<ProdColor> ProductColors因爲參數ProdctModelView product已經包含了所有那些價值。

+0

這是非常有用的處理多行復選框在一個單一的形式。當第一個複選框沒有被選中時,經典的索引技術沒有正確地綁定數組,所以像這樣分開就是要走的路 –

相關問題