创建包含列表集合的视图
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();
}
尚未对此进行测试,但希望它能为您指明正确的方向。
我需要一个 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();
}
尚未对此进行测试,但希望它能为您指明正确的方向。