【问题标题】:MVC Model with a list of objects as property具有对象列表作为属性的 MVC 模型
【发布时间】:2015-07-10 14:45:12
【问题描述】:

我正在开发一个 MVC 应用程序,其中 Model 类 Item 有一个名为 AvailableColoursList<Colour> 作为属性。

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

在 MVC 中执行此操作的最佳方法是什么?

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

型号

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

控制器

[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();
    }
}

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor


    【解决方案1】:

    模型

    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 循环以启用模型绑定和隐藏字段以允许将值回发到控制器

    Model Binding To A List

    管制员职位

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

    【讨论】:

    • Model.Items 的值是多少?请查看我的编辑 - 我正在从数据库中提取完整的颜色列表,并允许用户选择一个子集,该子集存储在 AvailableColours 属性中。
    • @PTuckley 抱歉,这是一个小错误。该物业是AvailableColours。我还对其进行了调整,以适应您最初未包含在问题中的更多细节。
    • 恐怕这对我来说仍然没有多大意义-您的答案中的模型是什么类型?在for循环声明中有对Model.AvailableColours的引用,但在隐藏字段中有对Model[i].ID的引用?
    • @PTuckley 通常你会使用ID 将一个项目绑定回一个数据库,如果你不需要,你可以简单地忽略它。
    • 我知道我的 Colour 类有 ID 字段,但是您如何访问 Model.AvailableColoursModel[i]?模型是ItemIEnumerable&lt;Item&gt; 的实例吗?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-01
        • 1970-01-01
        • 2019-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多