MVC4验证核对清单中至少一个项目的正确方法

时间:2013-02-05 02:50:53

标签: entity-framework asp.net-mvc-4

我正在开发我的第一个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,然后使用服务器端的东西来检查这个,但是我不确定在这种情况下如何从服务器端显示错误,我也希望有更清洁通过框架来实现这一目标。

1 个答案:

答案 0 :(得分:1)

这是您需要的自定义验证器。

Blog Link