2015-11-29 5 views
10

Mam widok, w którym renderowałem widok częściowy w pętli. Istnieje lista i widok częściowy jest powiązany z każdą pozycją na liście. Nie otrzymuję wartości listy na kontrolerze po wprowadzeniu wartości.Wyświetlenie listy danych w widoku kontrolera

Oto mój widok:

<table id="resourceRequirement" class="table" width="100%" border="0"> 
    <thead> 
     <tr style="background-color:#dfdfdf;"> 
      <td><div align="center">PRIORITY</div></td> 
      <td><div align="center">SYSTEM RESOURCE/COMPONENT</div></td> 
      <td><div align="center">RECOVERY TIME OBJECTIVE</div></td> 
     </tr> 
    </thead> 
    <tbody> 
     @foreach (var item in Model.ResourceRequirement) 
     { 
      @Html.Partial("~/Views/Shared/_ResourceRequirement.cshtml", item) 
     } 
    </tbody> 
</table> 

Oto mój częściowy widok:

@model DisasterManagementSystem.Models.BusinessImpactAnalysis.ResourceRequirement 
<tr> 
    <td> 
     @Html.TextBoxFor(m => m.priority)<br /> 
     <div style="color:red;"> 
      @Html.ValidationMessageFor(model => model.priority) 
     </div> 
    </td> 
    <td> 
     @Html.TextBoxFor(m => m.systemresource)<br /> 
     <div style="color:red;"> 
      @Html.ValidationMessageFor(model => model.systemresource) 
     </div> 
    </td> 
    <td> 
     @Html.TextBoxFor(m => m.receveryTime)<br /> 
     <div style="color:red;"> 
      @Html.ValidationMessageFor(model => model.receveryTime) 
     </div> 
    </td> 
</tr> 

Oto moja lista:

public List<ResourceRequirement> ResourceRequirement { get; set; } 

a klasa jest tutaj:

public class ResourceRequirement 
{ 
    [Required(ErrorMessage = "*")] 
    public string priority { get; set; } 

    [Required(ErrorMessage = "*")] 
    public string systemresource { get; set; } 

    [Required(ErrorMessage = "*")] 
    public string receveryTime { get; set; } 
} 

Proszę doradzić, gdy próbuję uzyskać listę z modelu na post otrzymuję listę jako null.

+0

Może działanie kontroler, który świadczonych ten pogląd nie dostarczać żadnych wartości w modelu? –

+0

początkowo pusty formularz jest renderowany po wypełnieniu szczegółów, nie zwraca wartości. zwracanie tylko wartości zerowej –

+0

Czy można również wyświetlić kod kontrolera? – levelonehuman

Odpowiedz

7

skorzystać z foreach pętli oraz częściowego generuje powielać name atrybuty bez indeksujących (więc nie może wiązać się z kolekcji) i powielać id atrybuty (nieprawidłowy HTML).

Zamiast częściowego widoku, należy użyć EditorTemplate. Zmień nazwę bieżącego widoku częściowego ResourceRequirement.cshtml (tj dopasować nazwę klasy) i umieścić go w folderze /Views/Shared/EditorTemplates (lub w folderze /Views/yourController/EditorTemplates)

Następnie w widoku głównym usunąć pętlę foreach i zastąpić go

<tbody> 
    @Html.EditorFor(m => m.ResourceRequirement) 
</tbody> 

Sposób EditorFor() akceptuje IEnumerable<T> i generuje poprawny kod HTML dla każdego elementu w kolekcji. Jeśli skontrolować HTML będzie teraz zobaczyć poprawna nazwa atrybuty w postaci kontroluje

<input type="text" name="ResourceRequirement[0].priority" .... /> 
<input type="text" name="ResourceRequirement[1].priority" .... /> 
<input type="text" name="ResourceRequirement[2].priority" .... /> 

itd., Które będą wiązać się z modelu po przesłaniu formularza (Porównaj to z tym, co aktualnie generuje swój)

+0

Co powinno być moją ścieżką folderu dla szablonu edytora. Nie miałem twojego znaczenia w linii "/ Widoki/Shared/EditorTemplates folder (w folderze/Views/yourController/EditorTemplates)" –

+0

Czy możesz wskazać, jak dodać wiersz w powyższej tabeli, używając jquery ?? Aby uzyskać dane –

+0

Załóżmy, że Twój kontroler nazywa się "HomeController", wtedy może znajdować się w folderze 'Views/Shared/EditorTemplates /' lub 'Views/Home/EditorTempates /'.Mechanizm wyszukiwania wyszukuje najpierw 'EditorTemplates' w folderze określonym przez kontroler, a jeśli go nie znajduje, to wyszukuje w folderze' Shared'. Dzięki temu możesz mieć wiele 'EditorTemplates' dla każdej klasy. W takim przypadku zmień jego nazwę i przenieś do folderu '/ Views/Shared/EditorTemplates' –

2

jak chcesz Lista być przekazywane w widoku tylko w kontrolerze przekazać listy za pomocą metody jak

public Actionresult List() 
{ 
    var search = from m in db.resourcerequirement select m; 
    return PartialView("_List",search.tolist()); 
} 

Potem w częściowym widokiem _List

@model DisasterManagementSystem.Models.BusinessImpactAnalysis.ResourceRequirement 
<tr> 
    <td> 
     @Html.TextBoxFor(m => m.priority)<br /> 
     <div style="color:red;"> 
      @Html.ValidationMessageFor(model => model.priority) 
     </div> 
    </td> 
    <td> 
     @Html.TextBoxFor(m => m.systemresource)<br /> 
     <div style="color:red;"> 
      @Html.ValidationMessageFor(model => model.systemresource) 
     </div> 
    </td> 
    <td> 
     @Html.TextBoxFor(m => m.receveryTime)<br /> 
     <div style="color:red;"> 
      @Html.ValidationMessageFor(model => model.receveryTime) 
     </div> 
    </td> 
</tr> 

Aby pokazać Częściowy widok

@{Html.RenderAction("List", "ControllerName");}