创建包含列表集合的视图

Create view that includes a list collection

我需要一个 Create 视图来捕获有关 ClubViewModel 及其发生时间表的信息。我以前通过将扁平包装成一个 class 来实现这一点,但是 运行 由于我的扁平包装单个 class 与我的存储库不匹配 classes.This 是我以前创建的结构观点:

public class ClubViewModel
    {
        public int ClubId { get; set; }
        public bool IsMonday { get; set; }
        public bool IsTuesday { get; set; }
        public bool IsWednesday { get; set; }
        public bool IsThursday { get; set; }
        public bool IsFriday { get; set; }
        [DataType(DataType.Time)]
        public DateTime? MondayFrom { get; set; }
        [DataType(DataType.Time)]
        public DateTime? MondayTo { get; set; }
        [DataType(DataType.Time)]
        public DateTime? TuesdayFrom { get; set; }
        [DataType(DataType.Time)]
        public DateTime? TuesdayTo { get; set; }
        [DataType(DataType.Time)]
        public DateTime? WednesdayFrom { get; set; }
        [DataType(DataType.Time)]
        public DateTime? WednesdayTo { get; set; }
        [DataType(DataType.Time)]
        public DateTime? ThursdayFrom { get; set; }
        [DataType(DataType.Time)]
        public DateTime? ThursdayTo { get; set; }
        [DataType(DataType.Time)]
        public DateTime? FridayFrom { get; set; }
        [DataType(DataType.Time)]
        public DateTime? FridayTo { get; set; }
        public string AdditionalInfo { get; set; }      
    }

我被告知我应该尝试使 ViewModel 与我的存储库模型保持更紧密的同步,以帮助稍后进行映射。

基于此,这些是我要在其上创建新 Create 视图的两个 ViewModel:

public class ClubViewModel
{
    public int ClubId { get; set; }
    public IList<CalendarEntryViewModel> MeetingDays { get; set; }          
    public string AdditionalInfo { get; set; }
}

 public class CalendarEntryViewModel
{
    public bool IsMonday { get; set; }
    public bool IsTuesday { get; set; }
    public bool IsWednesday { get; set; }
    public bool IsThursday { get; set; }
    public bool IsFriday { get; set; }

    [DataType(DataType.Time)]
    public DateTime? From { get; set; }
    [DataType(DataType.Time)]
    public DateTime? To { get; set; }        
}

我不明白的是,如果我为 ClubViewModel 添加一个视图,它自然会排除列表信息,我假设这需要在创建视图中的部分视图中,但是,我不明白我将如何像在扁平包装版本中那样满足所有可能的情况,我能够像这样很好地呈现:

老了但很好...http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

您不应该在 MeetDay 模型上需要所有日期标志(IsMonday、IsTuesday 等),您可以根据它在列表中的位置假设它是哪一天。当您填充列表以传递给视图时,您将根据需要创建尽可能多的天数 - 如果要显示整周则为 7 天,如果仅显示工作周则为 5 天。

只要您将视图传递给您期望的相同视图模型return,.NET 就应该负责绑定魔术。

您的视图类似于:

@model ClubViewModel

@for (int meetingDay = 0; meetingDay < Model.MeetingDays.Count; meetingDay++)
{
    @* Get the current day of week *@
    var dayOfWeek = Enum.GetName(typeof (DayOfWeek), meetingDay);

    <label>@dayOfWeek Start</label>
    @Html.TextBoxFor(m => Model.MeetingDays[meetingDay].From)
    <label>@dayOfWeek Finish</label>
    @Html.TextBoxFor(m => Model.MeetingDays[meetingDay].To)
}

你的控制器可能看起来像:

[HttpPost]
public ActionResult Index(ClubViewModel viewModel)
{
    var monday = viewModel.MeetingDays[(int)DayOfWeek.Monday];
    var tuesday = viewModel.MeetingDays[(int)DayOfWeek.Tuesday];
    // etc etc

    return View();
}

尚未对此进行测试,但希望它能为您指明正确的方向。