2017-01-06 1 views
-1

Ich habe das folgende Formular, das Daten in einem mehrdimensionalen Array enthält, das ich an meinen Server senden möchte. Das Problem ist, dass ich nicht in der Lage bin, diese Daten in meinem Controller abzurufen.Kann nicht übermittelte Formulardaten von MVC-Controller lesen

index.html

<form id="my-form" action="/Home/TestingMethod" method="post"> 
    <table id="people" class="table table-striped"> 
     <thead> 
      <tr> 
       <th>ID</th> 
       <th>Name</th> 
       <th>Owns Item</th> 
      </tr> 
     </thead> 
     <tbody> 
      <tr> 
       <td>1</td> 
       <td>Danny</td> 
       <td class="items"> 
        <select name="PersonList[1]Item[]" class="form-control"> 
         <option value=""></option> 
         <option value="Keys">Keys</option> 
         <option value="Phone">Phone</option> 
        </select> 
       </td> 
      </tr> 
     </tbody> 
    </table> 
</form> 

MyModel

public class MyModel 
{ 
    public List<int> PersonList { get; set; } 
} 

Homecontroller

[HttpPost] 
public JsonResult TestingMethod(MyModel model) 
{ 
    List<int> list_of_people = model.PersonList; 
    return Json("I am the server, I got your data."); 
} 

Das Problem ist, dass 0.123.enthält 0 Elemente.

Formulardaten vorgelegt

PersonList[1]Item[]:Phone 

bezogen werden: how to access Javascript multidimensional array in MVC controller

+0

Ihre 'PersonList' ist eine Liste von int, aber der Wert Ihrer Auswahl ist eine Zeichenkette? – Alex

+0

die 'Person' in meiner Form liefert eine int 1.' Person [1] ' –

+0

Was ist mit allen Down-Stimmen? –

Antwort

2

Die Namenskonvention Ihrer Auswahlfeld ist falsch. Um Ihre Modellstruktur übereinstimmen sollte es so aussehen:

<select name="PersonList[0]" class="form-control"> 
<select name="PersonList[1]" class="form-control"> 
<select name="PersonList[2]" class="form-control"> 
... 

Da die PersonList Eigenschaft nur ein Array von ganzen Zahlen ist. Stellen Sie außerdem sicher, dass Sie ganzzahlige Werte senden, wenn Sie auf ganze Zahlen zu binden in der Lage sein wollen:

<option value="0">Keys</option> 
<option value="1">Phone</option> 
... 

Und wenn Sie für leere Werte zulassen möchten, stellen Sie sicher, dass Ihre Liste als Nullable-Zahlen definiert:

public class MyModel 
{ 
    public List<int?> PersonList { get; set; } 
} 

und jetzt können Sie dies tun:

<option value=""></option> 
<option value="0">Keys</option> 
<option value="1">Phone</option> 
... 

Wenn auf der anderen Seite ist es eine komplexe Eigenschaft ist:

public class MyModel 
{ 
    public List<Person> PersonList { get; set; } 
} 

wo Person wie folgt definiert ist:

public class Person 
{ 
    public List<Item> Items { get; set; } 
} 

dann könnte man dies tun:

<select name="PersonList[0].Items[0].SomeProperty" class="form-control"> 
<select name="PersonList[0].Items[1].SomeProperty" class="form-control"> 
<select name="PersonList[1].Items[0].SomeProperty" class="form-control"> 
... 

Ich würde auch empfehlen, gehen Sie die following post durch die erklärt, wie das Modell Bindemittel funktioniert und was ist die Namenskonvention, die es erwartet.

+0

Ja das ist genau das, wonach ich suche, es ist ein benutzerdefiniertes Formular, das ich nicht direkt/einfach unter Verwendung der Standardbinder zu meinem Modell zuordnen kann. Ich werde es versuchen und sehen, ob ich es zum Laufen bringen kann. –

+0

Ich habe mich in PersonList geändert, aber mein Controller nimmt es immer noch nicht auf. Modell.PersonListe.Count = 0 –

+0

Da PersonList ein Array von ganzen Zahlen ist, stellen Sie sicher, dass Ihre Optionen auch ganze Zahlen sind: ''. Ein weiterer wichtiger Aspekt ist, dass die Indizes bei 0 beginnen sollten, nicht bei 1, wie in meinem Code gezeigt: '