2010-03-04 1 views
12

Mein Szenario ist dies: Ich habe zwei Listboxen, eine, die alle meine Datenbank-Elemente enthält, und eine leere. Der Benutzer fügt die erforderlichen Elemente aus dem vollständigen Listenfeld zur leeren Listbox hinzu.formcollection enthält nur die ausgewählten Werte der html.listbox-Elemente? MVC

Ich verwende ein Formular, um alle Elemente, die der Benutzer hinzugefügt hat, zu übermitteln.

Das Problem ist, nur die ausgewählten Elemente aus der Listbox werden gesendet. Wenn der Benutzer einige der Elemente abliest, werden sie nicht im Formular übermittelt. Meine Ansicht sieht so aus:

<% using (Html.BeginForm("MyAction", "MyController")) 
    { %> 

    <%= Html.ListBox("AddedItems", Model.Items)%> 

    <input type="submit" value="Submit" name="SubmitButton"/> 
<% } %> 

mein Controller sieht aus wie so:

public ActionResult MyAction(FormCollection formCollection) 
{ 
    var addedItems = formCollection["AddedItems"].Split(','); 

    //....more code that does stuff with the items 
} 

Bin ich über alles geht in die falsche Richtung? Gibt es eine bessere Möglichkeit, die Artikel einzureichen? Was würden Sie tun?

Antwort

22

Ich mache das auch, ich denke, die Art, wie ich es gelöst habe, ist ein bisschen eleganter. Im Wesentlichen habe ich nur eine Jquery-Funktion, die vor dem Formular-Post ausgeführt wird, der alle Optionen auswählt.

$(function() { 
     $("form").submit(function (e) { 
      $("#box2View option").attr("selected", "selected"); 
     }); 
    }); 
+0

ya das ist eigentlich was ich getan habe. – Darcy

+0

tolle idee mann! Danke =) –

1

Warum nicht die Liste der Elemente in den Kontrollkästchen haben. Dann könnten Sie die Kontrollkästchen in Ihrer Aktion durchlaufen und alle ausgewählten Kontrollkästchen markieren.

<% foreach(var item in Model.Items) { %> 

    <%= Html.CheckBox(String.Format("ItemID.{0}", item.ID)) %> // each item tagged by the items id 

<% } %> 

public ActionResult MyAction(FormCollection formCollection) 
{ 

      foreach (var key in collection.AllKeys.Where(k => !k.Contains("SubmitButton")).ToArray<string>()) 
      { 
       // iterates thru check boxes we got rid of the button 

      } 
} 
+0

Die Datenbankelemente könnten buchstäblich in Tausenden sein. Die Gegenstände, die der Benutzer benötigt, reichen in den meisten Fällen von 1 bis 10. Ich wollte eine einfache Möglichkeit für den Benutzer, alle ausgewählten Elemente zu sehen. Ich hatte gehofft, dass ich die html.listbox oder etwas binden und alle Elemente auf diese Weise bekommen könnte ... nicht wirklich wissen, ob das möglich ist/der richtige Ansatz – Darcy

2

Weil es nur Auswahlbox ist. Sie können nicht alle Werte in selectbox posten. Sie müssen Javascript verwenden, um hinzugefügte Elemente einzufangen und sie in verborgenen Eingaben zu speichern.

Ungeprüfter Code, aber ich denke, es hilft Ihnen.

+0

Dank ging ich mit einer ähnlichen Lösung. Ich habe gerade die Elemente zu einem versteckten hinzugefügt und habe es aus meiner FormCollection in den Controller – Darcy

+1

überhaupt nicht, andere Option ist einfach als dies, Sie können es mit der Auswahl aller Elemente beim Senden von Form, aber ich denke, es ist nicht eine gute Lösung. – cem