2014-10-12 2 views
-1

Я прочитал большую часть Google :-), но я не могу продолжить. Коллекция на моем объекте и остается пустой для публикации, независимо от того, что я делаю.ASP NET MVC 4 коллекция является нулевой на пост

My Model:

public class ArticleViewModel 
{ 
    public Guid EventId { get; set; } 
    public IList<ArticleItemViewModel> ArtikelListe { get; set; } 

    public decimal GesamtpreisNetto { get; set; } 
    public decimal MwSt { get; set; } 
} 

и

public class ArticleItemViewModel 
{ 
    public Guid EventId { get; set; } 
    public Guid Id { get; set; } 

    public string Artikelname { get; set; } 
    public string Artikelname_EN { get; set; } 

    public string Information { get; set; } 
    public string Information_EN { get; set; } 

    public decimal Preis { get; set; } 

    public bool MitAnzahl { get; set; } 
    public bool IstKategorie { get; set; } 

    public int Anzahl { get; set; } 
    public bool Checkbox { get; set; } 

    public int Reihenfolge { get; set; } 
} 

Моего Вид:

@using (Html.BeginForm("Next", "Article", FormMethod.Post)) 
{ 
@Html.HiddenFor(x => x.EventId) 

<input type="hidden" name="ArtikelListe" /> 

for (var i = 0; i < Model.ArtikelListe.Count; i++) 
// foreach (EventManager.ViewModels.ArticleItemViewModel artikelItem in Model.ArtikelListe) 
{    
    <div> 
     <div> 
      @if (Model.ArtikelListe[i].IstKategorie) 
      { 
       @Html.LabelFor(x => x.ArtikelListe[i].Artikelname)<br /> 
       @Html.LabelFor(x => x.ArtikelListe[i].Information) 
      } 
      else 
      { 
       if (Model.ArtikelListe[i].MitAnzahl) 
       { 
        @Html.TextBoxFor(x => x.ArtikelListe[i].Anzahl, new { @class = "field text fn" }) 
       } 
       else 
       { 
        @Html.LabelFor(x => x.ArtikelListe[i].Anzahl)      
       } 

       @Html.LabelFor(x => x.ArtikelListe[i].Artikelname)<br /> 
       @Html.LabelFor(x => x.ArtikelListe[i].Information) 
      }   
     </div> 
    </div> 
} 

На посте, я получаю свой ViewModel назад и имеет Коллекцию ArtikelListe с 15 пунктов (thats correct), но все они ноль!

В моем HTTP заголовок я получаю следующую запись данных:

EventId:824e7f3c-7190-4ebb-aa60-51b57c977b1e 
ArtikelListe: 
ArtikelListe[1].Anzahl:0 
ArtikelListe[2].Anzahl:1 
ArtikelListe[3].Anzahl:0 
submitButton:Nächste 

Интересно, почему только частичные данные передаются withon на HTTP POST, и почему все мои элементы списка являются недействительными. Я попытался сделать за и для forach. такой же результат.

Любые идеи? Я беспомощна.

ответ

1

Коллекция индексаторах должна начинаться с нуля и быть последовательными (если не включать Index собственности) .because ваших if заявления, вы не обязательно генерируя управления для свойства Anzahl. Рассматривая информацию заголовка, вы не имеете значения для ArtikelListe[0].Anzahl, что означает, что первый элемент должен иметь либо IstKategorie=true, либо MitAnzahl=false. Вы можете исправить это, добавив скрытый ввод поэтому значение сообщения назад

@if (Model.ArtikelListe[i].IstKategorie) 
{ 
    @Html.LabelFor(x => x.ArtikelListe[i].Artikelname)<br /> 
    @Html.LabelFor(x => x.ArtikelListe[i].Information) 
    @Html.HiddenFor(x => x.ArtikelListe[i].Anzahl) // add this 
} 
else 
{ 
    if (Model.ArtikelListe[i].MitAnzahl) 
    { 
    @Html.TextBoxFor(x => x.ArtikelListe[i].Anzahl, new { @class = "field text fn" }) 
    } 
    else 
    { 
    @Html.LabelFor(x => x.ArtikelListe[i].Anzahl) 
    @Html.HiddenFor(x => x.ArtikelListe[i].Anzahl) // add this   
    } 
    @Html.LabelFor(x => x.ArtikelListe[i].Artikelname)<br /> 
    @Html.LabelFor(x => x.ArtikelListe[i].Information) 
} 

В качестве альтернативы вы можете добавить Index свойство которого DefaultModelBinder использует совпасть элементы коллекции, которые не являются последовательными

@if (Model.ArtikelListe[i].IstKategorie) 
{ 
    @Html.LabelFor(x => x.ArtikelListe[i].Artikelname)<br /> 
    @Html.LabelFor(x => x.ArtikelListe[i].Information) 
} 
else 
{ 
    if (Model.ArtikelListe[i].MitAnzahl) 
    { 
    @Html.TextBoxFor(x => x.ArtikelListe[i].Anzahl, new { @class = "field text fn" }) 
    <input type="hidden" name="x.ArtikelListe.Index" value="@i" /> // add this manually 
    } 
    else 
    { 
    @Html.LabelFor(x => x.ArtikelListe[i].Anzahl)  
    } 
    @Html.LabelFor(x => x.ArtikelListe[i].Artikelname)<br /> 
    @Html.LabelFor(x => x.ArtikelListe[i].Information) 
} 

С первый вариант, он вернет все элементы. Во втором случае он будет отправлять только те элементы, которые соответствуют условиям if.

Примечание, как отметил Сергей, вам необходимо также удалить <input type="hidden" name="ArtikelListe" />

1

Проблема в этой строке:

<input type="hidden" name="ArtikelListe" /> 

Когда запрос POST отправляется обратно:

ArtikelListe: 
ArtikelListe[1].Anzahl:0 
ArtikelListe[2].Anzahl:1 
ArtikelListe[3].Anzahl:0 

ArtikelListe Тогда переопределяет значение для списка, и именно поэтому он всегда пустой. Так что вам просто нужно переименовать свое скрытое поле в другое имя, чтобы оно не противоречило существующим именам.

Здесь работает пример, основанный на коде MVC в DotNetFiddle - https://dotnetfiddle.net/BCXduq

Вы можете нажать кнопку RUN, а затем введите значения в двух полях ввода в правом нижнем поле и нажмите кнопку Сохранить. И тогда он отобразит модель, которую сервер получил в POST как текст JSON.

+0

Спасибо вам! Если я удалю, вся коллекция будет пустой для сообщения. Я проверю ваш код сейчас. –

+0

Если я удалю или переименую имя скрытого поля. Вот что я хотел сказать :-) –

+0

Ваш код отлично работает. Но у меня все еще есть пустая коллекция в моем коде. Что-нибудь еще вы изменили? Я просто не могу получить его ... –

1

Спасибо вам, ребята.

Проблема была в том, что я провел тестирование со сценарием из скрипки. В этом коде

Model.ArtikelListe[i].MitAnzahl 

всегда был правдой.

В случае, если это не так, значение «Anzahl» не было привязано к элементу управления, содержащему значение (но только метку).

@Html.LabelFor(x => x.ArtikelListe[i].Anzahl) 

Как только я вставил скрытое поле в пределах этого объема, и связанное значение «Anzahl» к нему, пост возвращается со всеми данными я ожидал.

Спасибо в любом случае. Я многому научился!

+0

Ничего себе. Я даю вам подробный и правильный ответ, и вместо того, чтобы принять его, вы публикуете это. Даже не голосование. Удачи в любой помощи в будущем. –

+0

Стивен, извините за мою ошибку. Это было давно, поэтому я не знаю, пропустил ли я ваш ответ или просто не знал лучше. В следующий раз, пожалуйста, спросите, прежде чем снимать. Благодарю. –

Смежные вопросы