如何在 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 3 从视图、模型中检索复选框值

模型中的 django 星期几表示

在 MVC/Razor 中,如何获取多个复选框的值并将它们全部传递给控制器​​?

如何使用 DataAnnotations 处理 ASP.NET MVC 2 中的布尔值/复选框?

有没有办法将复选框列表绑定到 asp.net mvc 中的模型

如何创建复选框列表?