2015-02-06 77 views
0

我需要一個Create視圖來捕獲有關ClubViewModel及其發生時間表的信息。我以前flatpacking爲一類,達到了這個但是碰到了,因爲我的扁平封裝的單級與AutoMapper問題不匹配我的庫包括兩個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與我的Repository模型更加接近,以幫助稍後進行映射。

在此基礎上,這是兩個的ViewModels我要創建我的新Create觀點:

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自然會排除列表信息,我假設這將需要在創建視圖中進行局部視圖,但是,我不明白我將如何滿足每種可能的情況,就像我在我的扁平版本中所做的那樣以很好的方式如下:

enter image description here

回答

3

Oldy但僞善... http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

你不應該需要你整天標誌(IsMonday,IsTuesday等)在您的MeetDay模型,你可以假設它在列表中的位置,這一天,它是基於。當您填充列表傳遞給視圖時,您將根據需要創建多少天 - 如果要顯示整整一週,則爲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(); 
} 

沒有測試過這一點,但希望這點你在正確的方向。

+0

好的解決方案。 +1 – 2015-02-06 17:05:01

+0

@timothyclifford你建議我改變我的CalendarEntryView模型,以取代所有布爾IsMonday等與DayOfWeek – JsonStatham 2015-02-09 09:50:04

+0

也即時嘗試創建一個創建視圖現在索引,這是否重要 – JsonStatham 2015-02-09 10:29:55