Salvataggio di una serie di forme creare con un pulsante di invio in ASP.Net MVC
-
13-09-2019 - |
Domanda
Per dare qualche informazione sul mio problema:
Ho 3 tabelle denominate Prodotti, pacchetti e PackageContents. Posso andare nella mia richiesta e aggiungere i prodotti, e quindi posso creare pacchetti di fuori di essi. Una delle fasi di creazione di un pacchetto è quello di creare tutti i contenuti del pacchetto. Per fare questo, ho creato una vista che attraversa tutti i prodotti e imposta un nuovo contenuto pacchetto per ogni - ponendo il PackageID e productID in campi nascosti. Quindi l'utente può selezionare un menu a discesa per ciascuno per indicare se il prodotto è nel pacchetto, oppure no.
Ecco il mio problema:
Questo rende un modulo separato per ogni prodotto, ognuno con un proprio pulsante Salva. Mi piacerebbe avere un pulsante che salva tutti i nuovi contenuti della confezione in una volta presentare. Qualcuno mi può dare un esempio di come scrivere il mio metodo POST per un ciclo su e salvare tutti i nuovi contenuti della confezione e come farebbe un tasto a mio avviso che salva tutto in una volta?
Il mio modello:
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;
}
}
}
Il controllore:
public ActionResult AddContents(int id)
{
Package package = customerRepository.GetPackage(id);
return View(new PackageContentViewModel(id) { });
}
The View:
<% 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>
<% } %>
<% } %>
Modifica
Ho deciso di pubblicare il codice che ha finito per lavorare per me, nel caso in cui nessun altro arriva e ha bisogno dello stesso aiuto:
Il mio Vista:
<% 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" />
<% } %>
Il mio 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 });
}
Soluzione
Qui potete leggere su legandosi a un elenco: legame modello a un elenco
Questo articolo è vecchio, nella versione più recente MVC non devi definire <input type="hidden" name="products.Index" value="0" />
, ma il resto è valido.
Modifica
Risposta al commento:
Se unica cosa che devi fare è selezionare se il prodotto è nel pacchetto o no, è possibile utilizzare MultiSelectList.
Se si desidera specificare quantità o altri attibutes, è possibile scrivere:
<% 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; } %>
<% } %>
azione Posta:
[HttpPost]
public ActionResult Edit(IList<PackageContent> products)
dove PackageContent è
class PackageContent
{
int ProductId{get;set;}
int Quantity{get;set;}
}