2013-05-11 15 views
5

Ho bisogno di passare l'array al metodo POST. Ma io sono, ovviamente, manca sometging mio punto di vista simile a questa:asp.net mvc 3 C# array di variabili

<%@ 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]"> 

La mia dichiarazione di metodo è simile al seguente:

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

e quando sto cercando di estrarre i dati sto ottenendo Valore non può essere nullo Cosa mi manca?

+0

A quale proprietà di 'rez' stai cercando di associare questi campi?Non è possibile associare un valore textbox a un tipo complesso. A meno che la tua proprietà non sia 'rez.x', questo non funzionerà. –

+0

Per int, ma l'ho modificato in stringa ottengo lo stesso risultato –

+0

Ma qual è la proprietà dell'oggetto 'Rezultat' a cui si sta tentando di associare? –

risposta

0

Verificare il collegamento del modello a un elenco here. Gli articoli pubblicati devono essere in un determinato formato per poterli recuperare come lista in azione POST.

1

se davvero wnat di farlo in questo modo è necessario utilizzare Penso modulo di raccolta

[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

Ci sono un paio di cose sbagliate qui:

  1. La visualizzazione viene digitato per Rezultat ma stai cercando di trattare il modello come IEnumerable<Rezultat>.
  2. Si sta tentando di associare ciascuna casella di testo a x[i] - che sarebbe equivalente a Model.x[i] - quando ciò che si desidera è vincolare a [i].x (ad esempio Model[i].x).

Quindi, per correggere questo, è necessario modificare un paio di cose.

Innanzitutto, modificare la visualizzazione per ereditare System.Web.Mvc.ViewPage<IEnumerable<Klausimynas.Models.Rezultat>>. Ora la tua vista può superare lo IEnumerable<Rezultat>, che è ciò che si aspetta l'azione del tuo controller.

In secondo luogo, cambiare questo:

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

A tal:

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

La ragione di questo è che il primo tenterà di associare il valore di Model.x[0], che è (o sarà, dopo aver digitato correttamente la vista) equivalente al primo elemento nella proprietà x di un'istanza di IEnumerable<Rezultat>. Questo ovviamente non è del tutto corretto, poiché un IEnumerable non espone alcuna proprietà x. Quello che vuoi è vincolare Model[0].x, che è la proprietà x dell'oggetto Rezultat all'indice 0.

Meglio ancora, utilizzare un helper per generare il nome per voi:

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

modificare il codice vista come segue:

<%@ 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]" /> 

Aggiornamento: il 2 pensieri, penso che questo sia il tuo problema reale, stai iniziando da 1-7, piuttosto che da 0-6.

Grazie Ant.

+1

Si anticipa che un'istanza di 'Rezultat' ha una proprietà indicizzabile chiamata' rez'? Penso che questo abbia bisogno di un ripensamento. –

+0

Ant ... Penso che tutto ciò che è sbagliato sia l'indicizzazione. DefaultModelBinder cercherà di far corrispondere il valore di input alla proprietà del tipo, "Rezultat" in questo caso, ma è molto sensibile agli indici specificati. Devono iniziare da 0 e devono essere contigui. –

+0

Non sono d'accordo che questo è il problema. La tua soluzione implica che sta cercando di passare 'Rezultat.x [0]' attraverso 'Rezultat.x [n-1]', quando da un'attenta lettura della domanda è chiaro - come specifica la mia risposta - che in realtà vuole passare 'Model [0] .x' a' Model [n-1] .x', dove 'Model' è un' IEnumerable '. –