Enregistrement d'une série de formulaires de création avec un bouton de soumission dans ASP.Net MVC

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

Question

Pour donner quelques informations sur mon problème:

J'ai 3 tables appelées Products, Packages et PackageContents.Je peux accéder à mon application et ajouter des produits, puis créer des packages à partir d'eux.L'une des étapes de configuration d'un package consiste à créer tout le contenu du package.Pour ce faire, j'ai créé une vue qui parcourt tous les produits et configure un nouveau contenu de package pour chacun - en plaçant le packageID et le productID dans des champs masqués.Ensuite, l'utilisateur peut sélectionner une liste déroulante pour chacun pour indiquer si le produit est dans l'emballage ou non.

Voici mon problème :

Cela génère un formulaire distinct pour chaque produit, chacun avec son propre bouton de sauvegarde.J'aimerais avoir un bouton de soumission qui enregistre tout le nouveau contenu du package en même temps.Quelqu'un peut-il me donner un exemple de la façon d'écrire ma méthode POST pour parcourir et enregistrer tous les nouveaux contenus du package et comment créer un bouton à mon avis qui les enregistre tous en même temps ?

Mon modele:

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;

            }
        }
    }

Le controlle:

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

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

La vue:

<% 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>

    <% } %>

<% } %>

MODIFIER

J'ai décidé de publier le code qui a fonctionné pour moi, au cas où quelqu'un d'autre viendrait et aurait besoin de la même aide :

Mon avis:

<% 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" />

<% } %>

Mon contrôleur :

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 });
    }
Était-ce utile?

La solution

Ici vous pouvez en savoir plus sur la liaison à une liste : Liaison de modèle à une liste

Cet article est ancien, dans la version plus récente de MVC, vous n'avez pas besoin de définir <input type="hidden" name="products.Index" value="0" />, mais le reste est valable.

MODIFIER

Réponse au commentaire :

Si la seule chose que vous faites est de sélectionner si le produit est dans le package ou non, vous pouvez utiliser MultiSelectList.

Si vous souhaitez spécifier la quantité ou d'autres attributs, vous pouvez écrire :

<% 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; } %>
<% } %>

Post-action :

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

où PackageContent est

class PackageContent
{
    int ProductId{get;set;}
    int Quantity{get;set;}
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top