2016-05-15 26 views
6

ho attaccato su questo tema per un po '..ASP.NET MVC 5 modello elenco vincolante è vuoto

ho creato un semplice modello di vista:

public class AddTranslationViewModel 
{ 
    public List<ProjectTranslation> ProjectTranslations { get; set; } 
    public AddTranslationViewModel() 
    { 
     ProjectTranslations = new List<ProjectTranslation>(); 
    } 
} 

classe ProjectTranslation:

public class ProjectTranslation 
{ 
    public int ProjectTranslationId { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string Address { get; set; } 

    public int LanguageId { get; set; } 
    public Language Language { get; set; } 

    public int ProjectId { get; set; } 
    public Project Project { get; set; } 

} 

Una vista semplice che utilizza l'AddTranslationViewModel

<table class="table"> 

    @foreach (var item in Model.ProjectTranslations) 
    { 
     @Html.HiddenFor(modelItem => item.ProjectTranslationId) 
     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => item.Language.LanguageCode) 
      </td> 
      <td> 
       @Html.EditorFor(modelItem => item.Title) 
      </td> 
     </tr> 
    } 

</table> 
<input type="submit" value="Send" /> 

e, infine, il mio metodo POST:

public ViewResult AddTranslation(AddTranslationViewModel projectTranslations) 
    { 
     if (ModelState.IsValid) 
     { 
      //... 
     } 
     return View(projectTranslations); 
    } 

L'idea è molto semplice, voglio mostrare un elenco di elementi dove dovrebbe essere possibile cambiare/modificare i valori.

Tuttavia, il collegamento del modello non funziona, il parametro projectsTranslations nel metodo HTTPPost AddTranslation è sempre vuoto.

Qual è l'errore qui?

+0

assicurarsi che si sta postando questa pagina utilizzando un

adeel41

+0

Ho provato un po 'di tutto, al momento è: @using (Html.BeginForm()) – mitti

+0

il nome dei metodi Get e Post Action è lo stesso? e conferma se hai usato [HttpPost] sul tuo metodo post azione – adeel41

risposta

6

Associazione a una lista di oggetti richiede la creazione di struttura di campo di input con nomi contenenti indici, vale a dire:

<input type="text" name="YourArrayOrList[0].SomeProperty" value="123" /> 
<input type="text" name="YourArrayOrList[0].SomeOtherProperty" value="321" /> 
<input type="text" name="YourArrayOrList[1].SomeProperty" value="123" /> 
<input type="text" name="YourArrayOrList[1].SomeOtherProperty" value="321" /> 

Inoltre, è necessario puntare il modulo per il corretto metodo di azione nel controller utilizzando Html.BeginFrom il metodo del rasoio (see documentation). In caso si dovrebbe assomigliare a questa:

@using(Html.BeginForm("AddTranslation","YourControllerName")) 
{ 
    for (int i=0;i<Model.ProjectTranslations.Count; i++) 
    { 
     @Html.HiddenFor(model => model.ProjectTranslations[i].ProjectTranslationId) 
     <tr> 
      <td> 
       @Html.DisplayFor(model => model.ProjectTranslations[i].Language.LanguageCode) 
      </td> 
      <td> 
       @Html.EditorFor(model => model.ProjectTranslations[i].Title) 
      </td> 
     </tr> 
    } 
} 

Se il metodo non è modificare, ma il metodo CREATE, poi, ovviamente, la vostra lista in modello avrà 0 elementi. In questo caso, modificare la condizione di arresto in per ciclo al conteggio desiderato.

Tenete a mente che questo argomento è stato discusso molte volte in passato:

ASP.NET MVC bind array in model

ASP.NET MVC - Can't bind array to view model

+0

Grazie, hai già cambiato il foreach in un ciclo for. Ho dovuto modificare il parametro ViewModel nel metodo AddTranslation in un elenco di ProjectTranslation, dopodiché ha funzionato. – mitti

+0

È possibile avere un modello complesso come parametro, non è necessario cambiarlo in Elenco . Il raccoglitore modello incorporato gestirà correttamente le proprietà nidificate se la vista genera nomi di input corretti. –

+0

L'uso di un ciclo foreach invece di un ciclo for è stata la cosa che mi ha dato problemi. –