以对象列表作为属性的MVC模型

本文关键字:MVC 模型 属性 对象 列表 | 更新日期: 2023-09-27 18:02:00

我正在研究一个MVC应用程序,其中模型类Item有一个名为AvailableColoursList<Colour>作为属性。

AvailableColoursColour类的用户定义子集。我想在一个复选框列表中显示所有Colour实例,当提交时,AvailableColours是包含选中的Colour类的List<Colour>

在MVC中做到这一点的最佳方法是什么?

编辑:我的代码到目前为止,虽然我觉得这不是最mvc的方式去做!

public class Item
{
    public int ID { get; set; }
    public List<Colour> AvailableColours { get; set; }
}
<<p> 视图/strong>
@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" />
}
控制器

[HttpPost]
public ActionResult Create(Item item, string[] colours)
{
    try
    {
        foreach (var colour in colours)
        {
            item.AvailableColours.Add(GetColour(colour));//retrieves from database
            return RedirectToAction("Index");
        }
    }
    catch
    {
       return View();
    }
}

以对象列表作为属性的MVC模型

Models

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属性

View for loop

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

注意使用for循环而不是foreach来启用模型绑定,使用隐藏字段来允许将值发回控制器

模型绑定到列表

控制器发布

[HttpPost]
public ActionResult Create(Item model)
{
    //All the selected are available in AvailableColours
    return View(model);
}

感谢您的所有建议-非常宝贵,但在我的程序绑定到模型之前,我还需要做一个更改,那就是向List添加getter和setter,如下所示:

public class CartViewModel
{
    public List<CartRowViewModel> cartRows {get; set; }
    public CartViewModel()
    {
        this.cartRows = new List<CartRowViewModel>();
    }
}

确保在类中添加构造函数并在其中声明列表。否则,它将声明为空值,您将无法稍后设置。

public class Item
{
  public Item(){
    AvailableColours =new List<Color>();
}
}