Frage

Ich habe ein Formular, das einen ganzen Haufen Dateneingabefelder enthält, das vom Benutzer abgeschlossen wird, einschließlich einiger Elemente, in denen der Benutzer bestimmen kann, wie viele der gleichen Elemente er eingeben werden. Dies ist wie in Phil Haacks Blogeintrag verwendet Modellbindung an eine Liste.

Ich verwende JQuery erfolgreich, um die zusätzlichen Formularelemente zu erstellen, korrekt indiziert usw. Mein Problem ist der beste Weg, diese in meinem Controller tatsächlich zu lesen. Der Controller im Artikel erwartet nur ein Objekt. IList<Product> Während mein Controller bereits a erwartet FormCollection form Und jetzt versuche ich es auch zu schicken und eine IList<Itmes> auch.

Sollte ich dies zu den vom Controller erwarteten Parametern hinzufügen oder über Formular ["Elements"] oder etwas anderes zugreifen?

Aussicht

<form action="/MyItems/Add" method="post">
   <input type="text" name="Title" value="" />

   <input type="hidden" name="myItem.Index" value="0" />
   <input id="item[0].Amount" name="item[0].Amount" type="text" value="" />
   <input id="item[0].Name" name="item[0].Name" type="text" value="" />

   <input type="hidden" name="myItem.Index" value="1" />
   <input id="item[1].Amount" name="item[1].Amount" type="text" value="" />
   <input id="item[1].Name" name="item[1].Name" type="text" value="" />
</form>

Regler

public ActionResult Add(FormCollection form)
{
    string Title = form["Title"];
    List<Item> Items = form["items"].ToList();
}

Dto

public class Item()
{
    int Amount {get; set; };
    string Name {get; set; };
}
War es hilfreich?

Lösung 2

Ich habe beschlossen, mit dem ausschließlich mit dem zusammenzuarbeiten FormCollection anstatt das Wasser zu verderben, wobei einige Daten verwendet werden FormCollection und andere Daten, die vom Framework einer Liste zugeordnet sind. Der folgende Code nimmt die Elemente auf und hydriert das DTO manuell. Dies funktioniert gut und ermöglicht es mir, einige andere Dinge in meinem Code zu machen, die nicht direkt auf eine Liste zugeordnet wurden.

List<Item> itemList = new List<Item>();
int i = 0;

while ( form["item[" + i + "].Amount"] != null)
{
    itemList.Add(new Item()
        {
            Amount = Convert.ToInt32(form[String.Format("item[{0}].Amount",i )]),
            Name = form[String.Format("item[{0}].Name",i )]
        });
}

Andere Tipps

Sie könnten das Myitem einfach als Parameter wie SO hinzufügen:

public ActionResult Add(FormCollection form, List<Item> myItem)
{
}

Es wird dann automatisch an den Formulardaten gebunden und den MyItem -Parameter bevölkert.

Ich habe es nicht ausprobiert, also müssen Sie es versuchen, aber warum nicht die Methode für UpdateModel oder TryUpDatemodel verwenden? Dies sollte auf die gleiche Weise binden wie die Übergabe des Ilisten in die Handlung des Controllers.

Das ist:

public ActionResult Add(FormCollection form)
{
    List<Item> items = new List<Item>();
    TryUpdateModel(items, form);
}

Ich bin nicht an meinem Entwicklungscomputer, also bin ich nicht sicher, ob es funktionieren wird, aber ich gehe davon aus, dass es sollte. Lassen Sie mich wissen, ob es das ist, was Sie brauchen.

Bearbeiten: Es ist erwähnenswert, dass ich, wenn Sie das Entity -Framework verwenden, auf viele Probleme mit den UpdateModel -Methoden gestoßen bin und meine eigenen geschrieben habe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top