2013-05-11 12 views
5

Potrzebuję przekazać tablicę do metody POST. Ale ja oczywiście brakuje sometging Moim zdaniem wyglądać następująco:asp.net mvc 3 C# post tablica zmiennych

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Klausimynas.Models.Rezultat>" %> 

<input type="text" name="x[1]"> 
<input type="text" name="x[2]"> 
<input type="text" name="x[3]"> 
<input type="text" name="x[4]"> 
<input type="text" name="x[5]"> 
<input type="text" name="x[6]"> 
<input type="text" name="x[7]"> 

Moja deklaracja metoda wygląda następująco:

[HttpPost] 
public ActionResult LetsTest(IEnumerable<Rezultat> rez) 

i kiedy próbuję wyodrębnić dane Dostaję Wartość nie może mieć wartości NULL. Czego mi brakuje?

+0

Do jakiej własności 'rez' próbujesz powiązać te pola?Nie można powiązać wartości pola tekstowego z typem złożonym. Jeśli twoja własność nie jest "rez.x", to nie zadziała. –

+0

Do int, ale zmieniłem go na napis otrzymuję ten sam wynik –

+0

Ale jaka jest własność obiektu 'Rezultat', z którym próbujesz się połączyć? –

Odpowiedz

0

Sprawdź powiązanie modelu z listą here. Wysłane elementy muszą mieć określony format, aby móc je pobrać jako listę w akcji POST.

1

jeśli naprawdę przeciwnym razie możesz to zrobić w ten sposób, trzeba użyć myślę Forma Collection

[HttpPost] 
public ActionResult LetsTest(FormCollection collection, IEnumerable<Rezultat> rez) 
{ 

    string[] inputs = new string[6]; 
    for(int i=1; i<8; i++) 
    { 
     //get all your array inputs 
     inputs[i-1]=collection["x["+i+"]"] 
    } 

} 
6

Istnieje kilka rzeczy źle tutaj:

  1. Państwa zdanie jest wpisany do Rezultat ale próbujesz traktować model jako IEnumerable<Rezultat>.
  2. Próbujesz powiązać każdy z pól tekstowych z x[i] - który byłby równoważny z Model.x[i] - kiedy naprawdę chcesz go powiązać z [i].x (tj. Model[i].x).

Aby to poprawić, musisz zmienić kilka rzeczy.

Najpierw zmień widok, aby odziedziczyć System.Web.Mvc.ViewPage<IEnumerable<Klausimynas.Models.Rezultat>>. Teraz Twój widok może przekazać IEnumerable<Rezultat>, czego oczekuje działanie kontrolera.

drugie, to zmienić:

<input type="text" name="x[0]"> 

do tego:

<input type="text" name="[0].x"> 

Powodem tego jest to, że najpierw będzie próbował powiązać wartość Model.x[0], który jest (lub będzie po prawidłowym wpisaniu widoku) odpowiada pierwszemu elementowi w obiekcie x instancji IEnumerable<Rezultat>. To oczywiście nie jest w porządku, ponieważ IEnumerable nie ujawnia żadnej właściwości x. To, czego chcesz, to powiązanie: Model[0].x, która jest własnością obiektu x obiektu Rezultat o indeksie o indeksie 0.

Jeszcze lepiej użyć pomocnika do generowania nazwy dla Ciebie:

for(int i=0; i < Model.Count; i++) 
{ 
    @Html.TextBoxFor(m => m[i].x) 
} 
0

Zmień swój kod widok następująco:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Klausimynas.Models.Rezultat>" %> 

<input type="text" name="x[0]" /> 
<input type="text" name="x[1]" /> 
<input type="text" name="x[2]" /> 
<input type="text" name="x[3]" /> 
<input type="text" name="x[4]" /> 
<input type="text" name="x[5]" /> 
<input type="text" name="x[6]" /> 

Aktualizacja: na 2. myśli, myślę, że jest to rzeczywisty problem, zaczynasz od 1-7, a nie 0-6.

Dzięki Ant.

+1

Przewiduje się, że wystąpienie 'Rezultat' ma właściwość indeksowaną o nazwie' rez'? Myślę, że to wymaga ponownego przemyślenia. –

+0

Mrówka ... Myślę, że wszystko, co złe, to indeksowanie. DefaultModelBinder spróbuje dopasować wartość wejściową do właściwości typu, 'Rezultat' w tym przypadku, ale jest bardzo wrażliwy na określone indeksy. Muszą zaczynać się od zera i muszą być ciągłe. –

+0

Nie zgadzam się, że to właśnie jest problem. Twoje rozwiązanie sugeruje, że próbuje przekazać 'Rezultat.x [0]' przez 'Rezultat.x [n-1]', kiedy od uważnego przeczytania pytania jest jasne - jak szczegółowo odpowiadam - że on naprawdę chce przekazać 'Model [0] .x' do' Model [n-1] .x', gdzie 'Model' jest' IEnumerable '. –

Powiązane problemy