创建包含列表集合的视图

时间:2015-02-06 15:42:56

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

我需要一个Create视图来捕获ClubViewModel及其发生时间表的信息。我以前通过flatpacking到一个类来实现这个,但是遇到了AutoMapper的问题,因为我的扁平包单个类与我的Repository两个类不匹配。这是我之前创建视图的结构:

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与我的Repository Models更紧密地同步,以便稍后帮助进行映射。

基于此,这些是我想要创建新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添加一个视图,它自然会排除List信息,我假设这需要在创建视图中进入局部视图,不过,我不明白我将如何迎合每一种可能的情况,就像我在平面包装版本中所做的那样,我能够很好地呈现:

enter image description here

1 个答案:

答案 0 :(得分:3)

Oldy但是一个好东西... http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

你不应该在MeetDay模型上需要你所有的一天旗帜(IsMonday,IsTuesday等),你可以假设它基于它在列表中的位置。填充列表以传递到视图时,您将根据需要创建多天 - 如果要显示整周,则为7天,如果仅显示工作周,则为5天。

只要您将视图传递给您希望它返回的视图模型,.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();
}

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