如何在MVC模型中表示一个月的复选框

时间:2015-04-14 12:08:43

标签: c# asp.net-mvc razor asp.net-mvc-5

我无法理解如何使用MVC创建下表,并成功将其绑定到模型:

enter image description here

我基本上需要跟踪一个事件需要发生的月份的哪几天。以下是我对模特的尝试:

编辑:这不是一个月,而是任意4周的周期

public class ScheduleViewModel
{
    public int PatientId { get; set; }          
    public List<Schedule> Schedules { get; set;}          
}

public class Schedule {
    public int Week { get;set;}
    public Day Day { get;set;}
    public bool IsSelected { get;set;}    
}

public enum Day
{
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday,
    Sunday
}

我可以成功渲染视图(不受模型约束)。我意识到我需要在我的输入上使用@ html.CheckBoxFor。

以下是我的html视图的粗略副本:

@model WebApplication10.Models.ScheduleViewModel
@using (Html.BeginForm())
{
<table class="table table-striped">
    <thead>
        <tr>
            <th></th>
            @{
foreach (Day t in Enum.GetValues(typeof(Day)))
{
    <th>@t</th>
}
            }
        </tr>
    </thead>
    <tbody>

        @{
for (int i = 1; i <= 4; i++)
{
    <tr>
        <td>Week @i</td>
        @foreach (Day t in Enum.GetValues(typeof(Day)))
        {
            <td><input type="checkbox" /></td>
        }
    </tr>
}
        }
    </tbody>
</table>

<div class="form-group">
    <div class="col-md-offset-2 col-md-10">
        <input type="submit" value="Create" class="btn btn-default" />
    </div>
</div>
}

如何成功发布选中了哪些复选框?我的ViewModel有意义吗?

1 个答案:

答案 0 :(得分:11)

我建议您将视图模型更改为

public class DayVM
{
  public Day Day { get; set; }
  public bool IsSelected { get; set; }
}
public class WeekVM
{
  public WeekVM()
  {
    Days = new List<DayVM>();
    Days.Add(new DayVM() { Day = Day.Sunday });
    Days.Add(new DayVM() { Day = Day.Monday });
    .. etc
  }
  public List<DayVM> Days { get; set; }
}
public class ScheduleViewModel
{
  public ScheduleViewModel()
  {
    Weeks = new List<WeekVM>();
    Weeks.Add(new WeekVM());
    .... etc
  }
  public int PatientId { get; set; }          
  public List<WeekVM> Weeks { get; set;}          
}

然后在视图中

for(int i = 0; i < Model.Weeks.Count; i++)
{
  <tr>
    <td>Week @i</td>
    for(int j = 0; j < Model.Weeks[i].Days.Count; j++)
    {
      <td>
        @Html.CheckBoxFor(m => m.Weeks[i].Days[j].IsSelected)
      </td>
    }
  </tr>
}

旁注:我认为你真的不需要你自己的枚举 - 你可以使用DayOfWeek枚举,例如Days.Add(new DayVM() { Day = DayOfWeek.Sunday });。另请注意,我没有包含Day属性的输入,因为您可以从集合中的索引轻松确定该属性。实际上,如果手动呈现表标题行,则可能根本不需要Day属性。