2015-11-29 14 views
10

Ho una vista in cui ho reso la vista parziale in un ciclo. C'è una lista e la vista parziale è vincolata con ogni elemento in una lista. Non ricevo il valore della lista sul controller dopo aver inserito il valore.Ottieni i dati dell'elenco sul controller

Qui è la mia opinione:

<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> 

Qui è la mia vista parziale:

@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> 

Ecco la mia lista:

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

E la classe è qui:

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

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

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

Si prega di avvisare quando sto cercando di ottenere la lista dal modello al post Sto ottenendo la lista come null.

+0

Forse l'azione di controllo che ha reso questo punto di vista non ha fornito alcun valore nel modello? –

+0

inizialmente il modulo vuoto viene visualizzato dopo aver riempito i dettagli e non sta restituendo i valori. restituendo solo null –

+0

Puoi mostrare anche il codice del controller? – levelonehuman

risposta

7

si utilizza di un ciclo foreach e un parziale di sta generando duplicare name attributi senza indicizzatori (quindi non può legarsi a una raccolta) e duplicare id attributi (HTML non valido).

Invece di una vista parziale, utilizzare EditorTemplate. Rinominare il parziale vista corrente ResourceRequirement.cshtml (cioè in base al nome della classe) e posizionarlo nella cartella /Views/Shared/EditorTemplates (o nella cartella /Views/yourController/EditorTemplates)

Poi nella vista principale, rimuovere il loop foreach e sostituirlo con

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

il metodo EditorFor() accetta IEnumerable<T> e genera la correttezza del codice HTML per ogni elemento nella vostra collezione. Se si controlla il codice HTML ora vedrete il nome corretto attributi nel modulo controlla

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

ecc che si legano al modello quando si invia il modulo (confrontare questo con ciò che il momento la generazione)

+0

Quale dovrebbe essere il percorso della cartella per il modello di editor. Non ho trovato il tuo significato di linea "/ Views/Shared/EditorTemplates cartella (nella cartella/Views/yourController/EditorTemplates)" –

+0

Puoi guidare come aggiungere una riga nella tabella sopra usando jquery ?? In modo da ottenere i dati –

+0

Supponiamo che il controller sia denominato 'HomeController', quindi può trovarsi nella cartella' Views/Shared/EditorTemplates/'o nella cartella' Views/Home/EditorTempates/'.Il motore di visualizzazione cerca dapprima 'EditorTemplates' nella cartella specifica del controllore e, se non lo trova, cerca nella cartella' Shared'. Questo ti permette di avere più 'EditorTemplates' per ogni classe. Nel tuo caso, basta rinominarlo e spostarlo nella cartella '/ Views/Shared/EditorTemplates' –

2

come si desidera Lista da passare nella vista solo nel controller passare l'elenco attraverso un metodo come

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

Dopo che in Vista parziale _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> 

Per mostrare Vista parziale

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