我正在开发我的第一个 MVC4 应用程序,在经历了一些 tuts 和一个原型之后,我觉得很舒服可以潜入其中。我正在使用代码优先的方法。我现在可以使用模型中的两个类创建一个联结表,以通过约定创建一个联结表,这很好。现在我有一个与此关系的一端相关联的复选框列表显示在另一个的创建视图中,这是所需的,接下来我想做的是以某种方式验证并显示一条错误消息,如果至少未选中其中一个复选框。
我的两个模型是事件和类别
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 中的“类别”索引,它为我提供了作为逗号分隔列表检查的类别的 ID,我可以处理这个问题,我现在想知道的是我该怎么做去验证类别中至少有一个复选框被选中?
我想这样做是使用数据注释,但我不确定此时如何实现这一点,因为复选框列表似乎是一个 hacky 实现。我知道我可以在客户端使用 js,然后使用一些服务器端的东西来检查这个,但是我不确定在这种情况下我将如何从服务器端显示错误,我也希望有一个更清洁的方法是通过框架来做到这一点。