我正在开发一个MVC应用程序,其中Model类Item
有一个名为List<Colour>
的{{1}}作为属性。
AvailableColours
是AvailableColours
类的用户定义子集。我想在复选框列表中显示所有Colour
个实例,并且在提交时,Colour
是包含已检查AvailableColours
类的List<Colour>
。
在MVC中执行此操作的最佳方法是什么?
编辑:我的代码到目前为止,虽然我觉得这不是最好的MVC方式!
模型
Colour
查看
public class Item
{
public int ID { get; set; }
public List<Colour> AvailableColours { get; set; }
}
控制器
@model MyNamespace.Models.Item
@using MyNamespace.Models;
@{
ViewBag.Title = "Create";
var allColours = new List<Colour>(); //retrieved from database, but omitted for simplicity
}
<h2>Create New Item</h2>
@using (Html.BeginForm("Create", "Item", FormMethod.Post))
{
<div>
@Html.LabelFor(model => model.AvailableColours)
@foreach (var colour in allColours)
{
<input type="checkbox" name="colours" value="@colour.Description" />
}
</div>
<input type="submit" value="Submit" />
}
答案 0 :(得分:23)
<强>模型强>
public class Item
{
public List<Colour> AvailableColours { get;set; }
}
public class Colour
{
public int ID { get; set; }
public string Description { get; set; }
public bool Checked { get; set; }
}
请注意Checked
属性
查看循环
@using (Html.BeginForm("Create", "Item", FormMethod.Post))
{
<div>
@Html.LabelFor(model => model.AvailableColours)
@for(var i = 0; i < Model.AvailableColours.Count; i++)
{
@Html.HiddenFor(m => Model.AvailableColours[i].ID)
@Html.HiddenFor(m => Model.AvailableColours[i].Description)
@Html.CheckBoxFor(m => Model.AvailableColours[i].Checked)
@Model.AvailableColours[i].Description<br/>
}
</div>
<input type="submit" value="Submit" />
}
注意foreach的for循环启用模型绑定,隐藏字段允许将值发布回控制器
控制器帖子
[HttpPost]
public ActionResult Create(Item model)
{
//All the selected are available in AvailableColours
return View(model);
}
答案 1 :(得分:0)
确保将构造函数添加到类中并在其中声明列表。否则,它将声明为空值,以后将无法设置。
public class Item
{
public Item(){
AvailableColours =new List<Color>();
}
}
答案 2 :(得分:0)
谢谢您的所有建议-非常宝贵,但是在我的程序绑定到模型之前,我还需要进行另一项更改,那就是在List中添加getter和setter,如下所示:
public class CartViewModel
{
public List<CartRowViewModel> cartRows {get; set; }
public CartViewModel()
{
this.cartRows = new List<CartRowViewModel>();
}
}