2016-05-15 11 views
6

Wsadziłem w tej kwestii na chwilę ..ASP.NET MVC lista wiążący 5 model jest pusty

stworzyłem prosty model wyświetlania:

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

klasa 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; } 

} 

prosty widok, który wykorzystuje 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" /> 

i wreszcie moja metoda POST:

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

Pomysł jest bardzo prosty, chcę pokazać listę elementów, w których powinno być możliwe, aby zmienić/edytować wartości.

Jednak powiązanie modelu nie działa, parametr projectsTranslations w metodzie HTTPPost AddTranslation jest zawsze pusty.

Co to za błąd?

+0

upewnić Piszesz do tej strony za pomocą

adeel41

+0

Próbowałem wszystkiego, w tej chwili: @using (Html.BeginForm()) – mitti

+0

to jest nazwa metod Get i Post Action jest taka sama? i sprawdź, czy użyłeś [HttpPost] w swojej metodzie post-działania. – adeel41

Odpowiedz

6

Wiązanie z listy obiekt wymaga stworzenia struktury pole wejściowe z nazwami indeksów zawierających, czyli:

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

Ponadto trzeba wskazać formę do właściwej metody działania w kontroler używając Html.BeginFrom metodę noża (see documentation). W was sprawa powinna wyglądać następująco:

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

Jeśli metoda nie zmieniać, ale metody Create, to oczywiście swoją listę w modelu będą miały 0 elementów. W takim przypadku zmień warunek zatrzymania w pętli for na żądaną liczbę.

Należy pamiętać, że ten temat był omawiany wiele razy wcześniej:

ASP.NET MVC bind array in model

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

+0

Dziękuję, zmieniłeś już foreach na pętlę for. Musiałem zmienić parametr ViewModel w AddTranslation Method na Listę ProjectTranslation - po tym, zadziałało. – mitti

+0

Możesz mieć złożony model jako parametr, nie ma potrzeby zmiany go na Listę . Wbudowany segregator modelu będzie poprawnie obsługiwał zagnieżdżone właściwości, jeśli widok generuje odpowiednie nazwy wejściowe. –

+0

Używanie pętli foreach zamiast pętli for było tym, co dawało mi problemy. –

Powiązane problemy