私は最初の MVC4 アプリを開発しています。いくつかのチュートリアルとプロトタイプを経て、飛び込むのに十分な快適さを感じました。コードファーストのアプローチを使用しています。私は、モデルから2つのクラスを使用してジャンクションテーブルを作成し、慣例を介してジャンクションテーブルを作成できるようになりました。これで、この関係の一方の端に関連付けられたチェックボックスのリストがもう一方の作成ビューに表示されます。これは望ましいことです。次にやりたいことは、何らかの方法で検証し、少なくともチェックボックスの 1 つがチェックされていません。
私の2つのモデルはイベントとカテゴリです
public class Event
{
public int EventID { get; set; }
[Required]
public string Title { get; set; }
public string Description { get; set; }
public string URL { get; set; }
public DateTime Published { get; set; }
public DateTime? Modified { get; set; }
public int Reputation { get; set; }
public int CityID { get; set; }
public virtual City City { get; set; }
public virtual ICollection<Category> Categories { get; set; }
}
public class Category
{
public int CategoryID { get; set; }
[Required]
public string Name { get; set; }
public DateTime Created { get; set; }
public Boolean IsActive { get; set; }
public virtual ICollection<Event> Events { get; set; }
}
これにより、必要に応じて、実行時に EventCategory テーブルも作成されます。
私のコントローラーはとてもシンプルです
public ActionResult Create()
{
ViewBag.CityID = new SelectList(db.Cities, "CityID", "Name");
ViewBag.Categories = new MultiSelectList(db.Categories, "CategoryID", "Name");
return View();
}
[HttpPost]
public ActionResult Create(Event _event)
{
if (ModelState.IsValid && ModelState["Categories"] != null)
{
db.Events.Add(_event);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.Categories = new MultiSelectList(db.Categories, "CategoryID", "Name");
ViewBag.CityID = new SelectList(db.Cities, "CityID", "Name", _event.CityID);
return View(_event);
}
そして、私のビューでチェックボックスを生成するには、
<div class="editor-label">
@Html.LabelFor(model => model.Categories, "Categories")
</div>
<div class="editor-field">
@foreach (SelectListItem c in ViewBag.Categories)
{
<input value="@c.Value" type="checkbox" name="Categories"/>@c.Text<br />
}
</div>
これにより、ModelStateDictionary の「Categories」インデックスを参照できるようになり、チェックされたカテゴリの ID がカンマ区切りのリストとして返されます。これに対処できます。この時点で知りたいのは、どのようにすればよいかということです。少なくとも 1 つのボックスがカテゴリにチェックされていることを検証しますか?
データ注釈を使用してこれを行いたいのですが、チェックボックス リストがハッキーな実装のように見えるため、この時点でこれをどのように達成できるかわかりません。クライアント側でjsを使用してから、サーバー側のものを使用してこれを確認できることはわかっていますが、この場合、サーバー側からエラーを表示する方法がわかりません。また、クリーナーがあることを願っていますフレームワークを通してそれを行う方法。