Frage

Um einige Hintergrundinformationen über mein Problem zu geben:

Ich habe 3 Tabellen genannt Produkte, Pakete und PackageContents. Ich kann in meiner Anwendung gehen und Produkte hinzufügen, und dann kann ich Pakete aus ihnen erstellen. Einer der Schritte zur Herstellung eines Pakets Einrichtung ist es, alle Paketinhalt zu erstellen. Dazu habe ich eine Ansicht erstellt, die alle Produkte durchläuft und setzt einen neuen Paketinhalt für jeweils bis - Platzierung der PackageID und ProduktID in versteckten Feldern. Dann kann der Benutzer ein Dropdown-Auswahl für jeden, um anzuzeigen, wenn das Produkt in der Verpackung ist, oder nicht.

Hier ist mein Problem:

Dies macht ein separates Formular für jedes Produkt, jede mit einem eigenen Taste speichern. Ich möchte eine Schaltfläche einreichen, die auf einmal alle neuen Paket-Inhalte speichert. Kann mir jemand ein Beispiel geben, wie über meine POST-Methode in einer Schleife zu schreiben, und alle neuen Paket-Inhalte speichern und wie ich einen Knopf meiner Meinung nach machen würde, die auf einmal alle von ihnen speichert?

Mein Modell:

public class PackageContentViewModel
{
    //Properties
    public IEnumerable<Product> products { get; set; }
    public Product product { get; set; }
    public Package package { get; set; }
    public PackageContent packageContent { get; set; }

    //Constructor
    public PackageContentViewModel(int id)
    {
        CustomerRepository customerRepository = new CustomerRepository();
        package = customerRepository.GetPackage(id);
        products = customerRepository.FindAllProducts().ToList();

        foreach (var product in products)
        {
            PackageContent packageContent = new PackageContent();
            {
                packageContent.PackageID = id;
                packageContent.ProductID = product.ProductID;

            }
        }
    }

Der Controller:

public ActionResult AddContents(int id)
    {
        Package package = customerRepository.GetPackage(id);

        return View(new PackageContentViewModel(id) { });
    }

Die Aussicht:

<% foreach (var product in Model.products)
   { %>

        <% using (Html.BeginForm())
           {%>

    <fieldset>
        <legend><%= Html.Encode(product.ProductName) %></legend>

            <%= Html.Hidden("PackageContentsID") %>
            <%= Html.ValidationMessage("PackageContentsID", "*") %>

            <%= Html.Hidden("PackageID", Model.package.PackageID) %>
            <%= Html.ValidationMessage("PackageID", "*") %>

            <%= Html.Hidden("ProductID", product.ProductID) %>
            <%= Html.ValidationMessage("ProductID", "*") %>


            <label for="InPackage">InPackage:</label>
            <%= Html.TextBox("InPackage") %>
            <%= Html.ValidationMessage("InPackage", "*") %>

            <label for="Restricted">Restricted:</label>
            <%= Html.TextBox("Restricted") %>
            <%= Html.ValidationMessage("Restricted", "*") %>
            <input type="submit" value="Create" />
    </fieldset>

    <% } %>

<% } %>

EDIT

Ich beschloss, den Code zu schreiben, die für mich am Ende arbeiten, falls jemand anders kommt und braucht die gleiche Hilfe:

Meine Ansicht:

<% int i = 0; using (Html.BeginForm("CreateContents", "Packages", new { id = Model.package.PackageID }))
    {

        foreach (var product in Model.products)
            { 

                %>
            <fieldset>
                <legend><%= Html.Encode(product.ProductName)%></legend>
                    <%= Html.Hidden("PackageContents[" + i + "].PackageContentsID")%>
                    <%= Html.ValidationMessage("PackageContentsID", "*")%>

                    <%= Html.Hidden("PackageContents[" + i + "].PackageID", Model.package.PackageID)%>
                    <%= Html.ValidationMessage("PackageID", "*")%>

                    <%= Html.Hidden("PackageContents[" + i + "].ProductID", product.ProductID)%>
                    <%= Html.ValidationMessage("ProductID", "*")%>

                    <label for="InPackage">InPackage:</label>
                    <%= Html.TextBox("PackageContents[" + i + "].InPackage", "yes")%>
                    <%= Html.ValidationMessage("InPackage", "*")%>

                    <label for="Restricted">Restricted:</label>
                    <%= Html.TextBox("PackageContents[" + i + "].Restricted", "no")%>
                    <%= Html.ValidationMessage("Restricted", "*")%>
            </fieldset>
            <%

        ++i; } %>

                    <input type="submit" value="Add Contents" />

<% } %>

Mein Controller:

public RedirectToRouteResult CreateContents(int id, IList<PackageContent> PackageContents)
    {
        Package package = customerRepository.GetPackage(id);

        foreach (var packageContent in PackageContents)
        {

            customerRepository.Add(packageContent);
            customerRepository.Save();

        }
        return RedirectToAction("SetPrice", new { id = package.PackageID });
    }
War es hilfreich?

Lösung

Hier können Sie über die Bindung an eine Liste lesen: Modell Bindung an eine Liste

Dieser Artikel ist alt, Sie in neuerer MVC-Version nicht <input type="hidden" name="products.Index" value="0" /> definieren müssen, aber der Rest ist gültig.

Bearbeiten

Antwort Kommentar:

Wenn nur, was Sie wählen zu tun ist, wenn das Produkt in dem Paket ist oder nicht, können Sie MultiSelectList verwenden.

Wenn Sie Menge oder andere attibutes angeben möchten, können Sie schreiben:

<% int i = 0; using (Html.BeginForm()) {%>
    <% foreach (var product in Model.products) { %>
        <label for="Restricted"><%= product.Name %></label>
        <%= Html.Hidden("products[" + i + "].ProductId",product.id) %>
        <%= Html.TextBox("products[" + i + "].Quantity",0) %>
        <br/>
   <% ++i; } %>
<% } %>

Nach Aktion:

[HttpPost]
public ActionResult Edit(IList<PackageContent> products)

Dabei gilt PackageContent ist

class PackageContent
{
    int ProductId{get;set;}
    int Quantity{get;set;}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top