2012-02-17 1 views
0

Таким образом, я создал список переменной длины, используя приведенный код here.Первичный ключ, установленный в ноль при отправке IEnumerable <T>

Когда я отправляю форму, первичные ключи сбрасываются на 0. В HTML-форме они не равны нулю, а действительным значениям. Как это исправить?

Форма

@using (Html.BeginCollectionItem("Kortingartikel")) { 

    @Html.HiddenFor(x => x.Artikelid) 
    @Html.TextBoxFor(x => x.Artikelnaam) 
    @Html.TextBoxFor(x => x.Prijs)</td> 

} 

Данные

Согласно Chrome, эти данные отправляются на сервер:

Kortingartikel.index:ad56efb0-ab7f-4b37-9d9b-712d7c3e3543 
Kortingartikel[ad56efb0-ab7f-4b37-9d9b-712d7c3e3543].Artikelid:5 
Kortingartikel[ad56efb0-ab7f-4b37-9d9b-712d7c3e3543].Artikelnaam:test artikel een 
Kortingartikel[ad56efb0-ab7f-4b37-9d9b-712d7c3e3543].Prijs:10,00 
Kortingartikel.index:b9624d8f-38e6-4092-ba1b-d004d0443a43 
Kortingartikel[b9624d8f-38e6-4092-ba1b-d004d0443a43].Artikelid:6 
Kortingartikel[b9624d8f-38e6-4092-ba1b-d004d0443a43].Artikelnaam:test artikel twee 
Kortingartikel[b9624d8f-38e6-4092-ba1b-d004d0443a43].Prijs:5,00 

Действие

Данные передаются к следующему действию:

public ActionResult Kortingartikel(IEnumerable<Kortingartikel> Kortingartikel) 

параметр 'Kortingartikel' имеет следующие значения:

[0]Artikelnaam:test artikel een 
    Prijs: 10 
    Artikelid: 0 
[1]Artikelnaam:test artikel twee 
    Prijs: 5 
    Artikelid: 0 

Свойство/Поле Artikelid Artikelid генерируется из linq- to-sql dbml file. Вот (генерируется автоматически) Код:

[global::System.Data.Linq.Mapping.ColumnAttribute(Name="artikelid", Storage="_artikelid", AutoSync=AutoSync.OnInsert, DbType="BigInt NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true, UpdateCheck=UpdateCheck.Never)] 
    public long Artikelid 
    { 
     get 
     { 
      return this._artikelid; 
     } 
        set 
     { 
      if ((this._artikelid != value)) 
      { 
       this.OnArtikelidChanging(value); 
       this.SendPropertyChanging(); 
       this._artikelid = value; 
       this.SendPropertyChanged("Artikelid"); 
       this.OnArtikelidChanged(); 
      } 
     } 
    } 
+1

Не могу сказать, не видя более код. Как выглядит модель просмотра и представленная модель? Как выглядит ваша форма? Вы делаете привязку специальной модели? Сначала это звучит как проблема привязки, когда первичный ключ (я предполагаю int) не отправляется из представления должным образом. – Leniency

+0

Обновленный вопрос с кодом – jao

ответ

2

Я подозреваю, что Artikelid на ваш взгляд модели Kortingartikel либо не имеет сеттер:

public int Artikelid { get; } // Bad 

или она не является публичной:

protected int Artikelid { get; set; } // Bad 

или это не свойство на всех, но это поле:

public int Artikelid; // Bad 

Во всех этих случаях связующее устройство по умолчанию не сможет установить его значение из запроса. Поэтому убедитесь, что это свойство объявляется с открытым геттер и сеттер на вашей модели представления:

public int Artikelid { get; set; } // Good 

Кроме того, чтобы избежать возможных конфликтов, попробуйте переименовать свой параметр действия:

public ActionResult Kortingartikel(IEnumerable<Kortingartikel> model) 
+0

См. Обновленный код. Это сгенерированный dbml, который не похож, что у него есть сеттер. У него не было сеттера, потому что во время отладки я изменил его только на чтение, но все равно не работает, но – jao

+1

@jao, yeap. В любом случае вы никогда не должны передавать свои сущности домена. Вы должны определить модели просмотра и только просматривать и просматривать модели из своих представлений. Автогенерированные классы не имеют ничего общего с приложением ASP.NET MVC. Вы можете использовать их в своем сервисе или на каком-либо бэкэнд-слоте. В ASP.NET MVC вы должны работать с моделями просмотра.Извините, но как вы ожидаете, что связующее устройство по умолчанию сможет назначить значение для свойства, которое даже не имеет сеттера? –

+0

Я также обновил параметр действия, но это все еще не работает. – jao