web-dev-qa-db-ja.com

プロパティとしてオブジェクトのリストを持つMVCモデル

ModelクラスItemがプロパティとしてAvailableColoursという名前のList<Colour>を持っているMVCアプリケーションで作業しています。

AvailableColoursは、Colourクラスのユーザー定義サブセットです。チェックボックスリストにすべてのColourインスタンスを表示したいと思います。送信されると、AvailableColoursColourクラスを含む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();
    }
}
8
LoveFortyDown

モデル

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をinstedにしたforループがモデルのバインディングを有効にし、隠しフィールドが値をコントローラーにポストバックできるようにすることに注意してください。

リストへのモデルのバインド

コントローラーポスト

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

    return View(model);
}
27
hutchonoid

クラスにコンストラクタを追加し、その中にリストを宣言してください。それ以外の場合は、後で設定できないヌル値を取ると宣言されます。

public class Item
{
  public Item(){

    AvailableColours =new List<Color>();
}

}
0
Priyanka Arora