ModelクラスItem
がプロパティとしてAvailableColours
という名前のList<Colour>
を持っているMVCアプリケーションで作業しています。
AvailableColours
は、Colour
クラスのユーザー定義サブセットです。チェックボックスリストにすべてのColour
インスタンスを表示したいと思います。送信されると、AvailableColours
は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();
}
}
モデル
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);
}
クラスにコンストラクタを追加し、その中にリストを宣言してください。それ以外の場合は、後で設定できないヌル値を取ると宣言されます。
public class Item
{
public Item(){
AvailableColours =new List<Color>();
}
}