Wie beurteilen Sie die Ausgabe eines dynamisch generierten Formular in ASP.NET MVC behandeln?

StackOverflow https://stackoverflow.com/questions/223149

  •  03-07-2019
  •  | 
  •  

Frage

Angenommen, Sie ein Formular erstellen, ASP.NET MVC, die eine dynamische Anzahl von Formelementen hat.

Zum Beispiel müssen Sie ein Kontrollkästchen für jedes Produkt, und die Anzahl der Produkte ändert sich von Tag zu Tag.

Wie werden Sie die Formulardaten werden zurück an den Controller geschrieben behandeln? Sie können keine Parameter auf die Aktion-Methode festgelegt, weil Sie nicht wissen, wie viele Formularwerte zurückkommen werden werden.

War es hilfreich?

Lösung

Just geben jedem Checkbox einen eindeutigen Namen-Wert:

<input class="approveCheck" id="<%= "approveCheck" + recordId %>" 
 name="<%= "approveCheck" + recordId %>" type="checkbox" />

Dann die Liste der Formularwerte in der Aktion analysieren, nach einreichen:

foreach (var key in Request.Form.Keys)
    {
        string keyString = key.ToString();
        if (keyString.StartsWith("approveCheck", StringComparison.OrdinalIgnoreCase))
        {
            string recNum = keyString.Substring(12, keyString.Length - 12);

            string approvedKey = Request.Form["approveCheck" + recNum];
            bool approved = !String.IsNullOrEmpty(approvedKey);
            // ...

Sie müssen keine Formularwerte als Argumente zu übergeben; Sie können sie nur von Request.Form erhalten.

Eine andere Option. Wie bitte Modell Binder die Liste in einem benutzerdefinierten Typ für Formularübermittlung ändern

Andere Tipps

Per Craig Antwort .. das ist sicherer. Es gibt Macken mehrere Formularelemente mit dem gleichen Namen zu veröffentlichen. Ich möchte hinzufügen, dass es klug wäre, um die Logik zu wickeln, dass die „Sammlung“ von Kontrollen in ähnlicher Weise wie WebForms macht. Web Forms prepend den Namen des Containersteuer und fügt einen Index. Zum Beispiel im Innern in einem Repeater der Formelemente würden (so etwas wie) RepeaterName_Element1, RepeaterName_Element2 genannt werden. Wenn Sie die Elemente raus gehen, haben Sie Findcontrol oder etwas dergleichen verwenden.

In Abhängigkeit von der Bindemitteln Sie verwenden, sollte diese Arbeit:

<%var i = 0;
  foreach (var product (IList<ProductSelection>)ViewData["products"]) {%>
      <%=Html.Hidden(string.Format("products[{0}].Id", i), product.Id)%>
      <%=Html.Checkbox(string.Format("products[{0}].Selected", i))%>
      <%=product.Name%><br/>
<%}%>

..., die in HTML so etwas wie diese (man beachte die Array-Notation auf den Namen) führen wird:

<input name="products[0].Id" type="hidden" value="123">
<input name="products[0].Selected" type="checkbox">
Widget
<input name="products[1].Id" type="hidden" value="987">
<input name="products[1].Selected" type="checkbox">
Gadget

... und die Controller-Methode, die die Post behandelt:

public ActionResult SelectProducts(IList<ProductSelection> products)
{
     ...
}

Bei der Bindung werden die Produkte Parameter zwei Instanzen von Produktauswahl enthalten.

Ein Nachteil ist, dass ich nicht die neue Standardbindung für komplexe Objekte verwendet habe. Ich verwende vielmehr entweder die NameValueDeserializer oder CastleBind, beide aus MvcContrib. Beide verhalten sich auf diese Weise. Ich vermute, in der Beta-Bindung wird auf die gleiche Weise arbeiten.

Abhängig von Ihren Daten können Sie entweder Ausgang a ‚CheckBoxList‘ (die in den neueren Versionen nicht mehr möglich ist) und einen string[]-Parameter verwenden, oder Sie können mehrere Formulare und einfach modifizieren, um die Aktion eingestellt.

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