我正在开发我的第一个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中引用“Categories”索引,它给出了作为逗号分隔列表检查的类别的ID,我可以处理它,我想知道的是在这一点上如何确认至少有一个方框可以检查类别?
我想这样做是使用数据注释,但我不知道如何实现这一点,因为复选框列表似乎是一个hacky实现。我知道我可以在客户端使用js,然后使用服务器端的东西来检查这个,但是我不确定在这种情况下如何从服务器端显示错误,我也希望有更清洁通过框架来实现这一目标。