如何在 MVC 模型中表示一个月的复选框
Posted
技术标签:
【中文标题】如何在 MVC 模型中表示一个月的复选框【英文标题】:How to represent a month of checkboxes in an MVC model 【发布时间】:2015-06-20 00:54:29 【问题描述】:我无法理解如何使用 MVC 创建下表,并将其成功绑定到模型:
我基本上需要跟踪一个月中的哪些日子需要发生事件。这是我对模型的尝试:
编辑:这不是一个月,而是任意 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 有意义吗?
【问题讨论】:
我会说你大致走在正确的轨道上,但你必须考虑到一个月通常有 5 周(只有 2 月有 4 周),而且你应该围绕你的视图模型不在枚举周围,您可以将复选框的 Value 属性绑定到视图模型的 IsSelected 属性 您没有绑定到您的任何模型属性,因此在您提交时不会发回任何内容。 好的,很酷,所以我需要为 Schedules 创建结构(一个预先填充的 IsSelected 设置为 false 的计划列表),然后将模型传递给 create 视图,然后使用 @html 进行绑定。复选框 您可能应该在您的问题中添加关于它如何只是“随机”4 周的时间,而不是与月份挂钩。我也正要为你做一个答案,这将是错误的,因为我根据缺失的信息做出了错误的假设。 @krillgar - 道歉 > 更新了问题 【参考方案1】:我建议您将视图模型更改为
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
属性。
【讨论】:
干净而出色的解决方案! @斯蒂芬 谢谢 - 这很好用 - 我为 day 属性添加了一个隐藏的输入,尽管它并不是真正需要的,并且可以很好地使用你提到的数组索引以上是关于如何在 MVC 模型中表示一个月的复选框的主要内容,如果未能解决你的问题,请参考以下文章
在 MVC/Razor 中,如何获取多个复选框的值并将它们全部传递给控制器?
如何使用 DataAnnotations 处理 ASP.NET MVC 2 中的布尔值/复选框?