asp.net MVC Checkboxes DaysOfWeek枚举

时间:2014-10-25 20:53:23

标签: asp.net asp.net-mvc checkbox enums dayofweek

我正在处理一个可用于添加新记录和更新现有记录的表单。 一个表单元素是捕获工作日的多个选项。因此,我实施了DayOfWeek Enum。

这就是我的模型的样子

public class EventFormModel
{
    public EventFormModel()
    {

        AvailableDays = (from DayOfWeek d in Enum.GetValues(typeof(DayOfWeek))
                       select new MyDay
                       {
                           Id = (int)d,
                           Name = d.ToString()
                       }

    public List<MyDay> AvailableDays { get; set; }
    public int[] SelectedDays { get; set; }
    }
}

public class MyDay
{
    public string Name { get; set; }
    public int Id { get; set; }
}

我的视图看起来像这样

@foreach (var day in Model.AvailableDays)
        {
        <input type="checkbox" name="SelectedDays" value="@day.Id"
        @if (Model.SelectedDays != null && Model.SelectedDays.Contains(day.Id))
        {
            <text>checked="checked"</text>
        }
        />@day.Name.Substring(0,3)
        }

现在我遇到了2个问题,1我无法弄清楚如何从我的复选框中检索它们发布到控制器的值以及2如何用我存储在数据库中的值填充复选框列表即SelectedDays = 1,4,6。

我希望我首先接近这个正确的方法。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

人们如何坚持编写自己的HTML,从而不会让我感到惊讶,然后对于为什么事情不起作用感到困惑。

尽可能坚持使用html助手。稍微改变你的模型......让SelectedDays成为一个bool数组[7]

@for(int i = 0; i < Model.SelectedDays.Count; i++)
{
    @Html.CheckBoxFor(x => x.SelectedDays[i])
}

现在复选框会自动填充,默认为未选中。

或者,您可以在MyDay类中添加“selected”bool字段,然后将其更改为:

@for(int i = 0; i < Model.AvailableDays.Count; i++)
{
    @Html.CheckBoxFor(x => x.AvailableDays[i].Selected)
}

注意:请勿将此更改为使用foreach,否则,不会为名称字段创建正确的索引以发布集合值。

答案 1 :(得分:0)

经过一段时间的修补,我想出了这个有效的解决方案。

这是模型

public class EventFormModel
{
    public EventFormModel()
    {

        AvailableDays = (from DayOfWeek d in Enum.GetValues(typeof(DayOfWeek))
                       select new MyDay
                       {
                           Id = (int)d,
                           Name = d.ToString()
                       }

    public List<MyDay> AvailableDays { get; set; }
    }
}

public class MyDay
{
    public string Name { get; set; }
    public int Id { get; set; }
    public bool Selected { get; set; }
}

这是视图

@for(int i = 0; i < Model.AvailableDays.Count; i++)
            {
               <div>
                @Html.CheckBoxFor(x => x.AvailableDays[i].Selected)
                @Html.HiddenFor(x => x.AvailableDays[i].Name)
                @Model.AvailableDays[i].Name
               </div>       
            }

这是控制器

[AcceptVerbs(HttpVerbs.Post), Authorize]
public ActionResult AddEvent(EventFormModel model)
{
            string days = "";
            for(int i = 0; i < model.AvailableDays.Count; i++)
            {
                if (model.AvailableDays[i].Selected)
                {
                    days = days + model.AvailableDays[i].Name + ",";
                }
            }
            //Do something with your selected days
            return View(model);

 }

使用选择项

填充复选框
string[] stringArray = "Sun,Mon,Tue,Wed".Split(',').ToArray<string>();

            model.AvailableDays = (from DayOfWeek d in Enum.GetValues(typeof(DayOfWeek))
                                   select new TestDay
                                   {
                                       Id = (int)d,
                                       Name = d.ToString().Substring(0, 3),
                                       Selected = stringArray.Contains(d.ToString().Substring(0, 3))
                                    }).ToList();