2015-10-03 2 views
2

Я работаю над веб-приложением ASP.NET MVC, и мне нужно отправить List<ProdColor> в Controller, используя checkbox s. Вот мой кодКак правильно передать значения флажка контроллеру в 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". Если флажок установлен, то оба true и false размещены, но привязано только первое (true) значение. Если флажок снят, отображается только false.

Затем в методе POST, вы можете получить корочки выбранных элементов с помощью (скажем)

var selectedColors = product.ColorList.Where(c => c.IsSelected).Select(c => c.Color_id); 

Обратите внимание, что вам не нужен параметр в методе POST для List<ProdColor> ProductColors, поскольку параметр ProdctModelView product уже содержит все эти значения.

+0

Это было очень полезно при работе с несколькими строками флажков в одной форме , Классическая методика индексирования не привязывала массив правильно, когда первый флажок не был выбран, поэтому разбить его так, как это было –

Смежные вопросы