2012-12-23 13 views
8

To jest mój pierwszy projekt C#/MVC i mam problemy z powiązaniem z modelem. Przeczytałem zgłoszony Phil Haack's Post i użyłem EditorFor dla wszystkich moich częściowych widoków. Czy potrzebuję niestandardowego modułu wiążącego model? Proszę pomócMVC C# Automatyczne wiązanie modeli na listach zagnieżdżonych

W skrócie, mam listę tygodni, które zawierają listę wpisów. Wpisy te zawierają wykaz godzin

Działanie:

[HttpPost] 
public ActionResult SubmitRecords(List<WeekCollection> itemData) 
{ 
    //do stuff 
    return View(); 
} 

Model:

public class WeekCollection 
{ 
    public WeekCollection() 
    { 
     this.OneWeek = new List<Entry>(); 
    } 

    public List<Entry> OneWeek { get; set; } 
} 

[Bind(Exclude = "Task, Project")] 
public class Entry 
{ 
    public int ProjectId { get; set; } 
    public virtual Projects Project { get; set; } 

    public int TaskId { get; set; } 
    public virtual Tasks Task { get; set; } 

    public bool Billable { get; set; } 
    public List<Hours> Gethours { get; set; } 
} 

public class Hours 
{ 
    public float NumberOfHours { get; set; } 
} 

widoki (Indeks)

//within partial view iteration with incrementing u (u++) 
@using(@Html.BeginForm()) 
{ 
    @Html.EditorFor(m => m[u].OneWeek, "TimesheetWeek") 
    <input type="Submit"> 
} 

widoki (TimesheetWeek)

@foreach (var value in Model) 
{ 
    v++; 
    if (Model.All(x => x.projectId == 0)) 
    { 
     @Html.DropDownListFor(p => p[v].projectId, (IEnumerable<SelectListItem>)projectList, "Select Project", new { @class = "notSelect" }) 
     @Html.DropDownListFor(t => t[v].taskId, (IEnumerable<SelectListItem>)taskList, "Select Task", new { @class = "notSelect" }) 
    } 
    else 
    { 
     if (value.projectId != 0) 
     {  
      @Html.DropDownListFor(p => p[v].projectId, (IEnumerable<SelectListItem>)projectList, new Dictionary<string, Object> { { "class", "SelectDrop" }, { "data-selectHead", value.projectId } }) 
      @Html.DropDownListFor(t => t[v].taskId, (IEnumerable<SelectListItem>)taskList, new Dictionary<string, Object> { { "class", "SelectDrop" }, { "data-selectHead", value.taskId } }) 
     } 
    } 

    @Html.CheckBoxFor(b => b[v].billable) 
    @Html.EditorFor(h => h[v].gethours, "HoursDisplay") 

    @value.gethours.Sum(a => a.numberOfHours) 
    } 

View (HoursDisplay)

@for (var i = 0; i < Model.Count(); i++) 
{ 
    @Html.TextBoxFor(m => m[i].numberOfHours) 
} 

model wyświetla wszystkie dane poprawnie i wyjście forma dane pisał następująco:

[0].OneWeek.[0].projectId:1 
[0].OneWeek.[0].taskId:1 
[0].OneWeek.[0].billable:true 
[0].OneWeek.[0].billable:false 
[0].OneWeek.[0].gethours.[0].numberOfHours:0 
[0].OneWeek.[0].gethours.[1].numberOfHours:5 
[0].OneWeek.[0].gethours.[2].numberOfHours:7 
[0].OneWeek.[0].gethours.[3].numberOfHours:6 
[0].OneWeek.[0].gethours.[4].numberOfHours:4 
[0].OneWeek.[0].gethours.[5].numberOfHours:8 
[0].OneWeek.[0].gethours.[6].numberOfHours:0 

Myślałem mam prawo indeksowania ale obecnie dostać pusty Oneweek w akcji. Co ja robię źle? Każda pomoc jest doceniana. (Niektóre powtórzenia i HTML zostały usunięte)

Odpowiedz

7

Twoje prefiksy są błędne. Na przykład:

[0].OneWeek.[0].projectId:1 

powinno być:

[0].OneWeek[0].projectId:1 

Masz dodatkową kropkę (.). Przeczytaj Phil Haack's article ponownie, aby uzyskać poprawną składnię podczas wiązania z listami.

Masz ten sam problem z częścią gethours.[0].

Polecam Ci przy użyciu standardowych szablonów edytora konwencje i uniknąć pisania żadnych pętla foreach i radzenia sobie z indeksami:

~/Views/Home/Index.cshtml:

@model List<WeekCollection> 
@using(Html.BeginForm()) 
{ 
    @Html.EditorForModel() 
    <input type="Submit" /> 
} 

~/Views/Home/EditorTemplates/WeekCollection.cshtml:

@model WeekCollection 
@Html.EditorFor(x => x.OneWeek) 

~/Views/Home/EditorTemplates/Entry.cshtml:

@model Entry 
... 
+0

To zadziałało doskonale, dziękuję. Nie zdawałem sobie sprawy z tego, jak użyteczne jest narzędzie EditorFor iw związku z tym modele widoku są znacznie prostsze. Bardzo przydatna wiedza. Dzięki + Wesołych Świąt – user1925048

+0

Jaki jest kod dla Entry.cshtml? – Apollo

Powiązane problemy