Almacenamiento de una serie de formas de crear con un solo botón de enviar en ASP.Net MVC
-
13-09-2019 - |
Pregunta
Para dar algunos antecedentes sobre mi problema:
Tengo 3 tablas llamadas productos, paquetes y PackageContents. Puedo ir en mi solicitud y añadir productos, y entonces puedo crear paquetes fuera de ellos. Uno de los pasos de la creación de un paquete es crear todos los contenidos del paquete. Para ello, he creado una vista que se extiende a través de todos los productos y establece un nuevo paquete de contenido para cada uno - colocar el PackageID y productID en campos ocultos. A continuación, el usuario puede seleccionar un menú desplegable para cada uno para indicar si el producto está en el paquete, o no.
Aquí está mi problema:
Esto hace que una forma separada para cada producto, cada uno con su propio botón de guardar. Me gustaría tener un botón que guarda todos los nuevos contenidos del paquete a la vez presenten. Alguien me puede dar un ejemplo de cómo escribir mi método POST para recorrer y guardar todos los nuevos contenidos del paquete y cómo lo haría un botón en mi opinión de que salva a todos ellos a la vez?
Mi modelo:
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;
}
}
}
El controlador:
public ActionResult AddContents(int id)
{
Package package = customerRepository.GetPackage(id);
return View(new PackageContentViewModel(id) { });
}
El Vista:
<% 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>
<% } %>
<% } %>
editar
he decidido publicar el código que terminó trabajando para mí, por si alguien más llega y necesita la misma ayuda:
Mi 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" />
<% } %>
Mi controlador:
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 });
}
Solución
Aquí puede leer sobre la unión a una lista: unión Modelo a una lista
Este artículo es viejo, en la versión nueva MVC usted no tiene que definir <input type="hidden" name="products.Index" value="0" />
, pero el resto es válido.
Editar
Respuesta al comentario:
Si lo único que hacer es seleccionar si el producto está en el paquete o no, puede utilizar MultiSelectList.
Si desea especificar la cantidad o otros attibutes, se puede escribir:
<% 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; } %>
<% } %>
acción de la publicación:
[HttpPost]
public ActionResult Edit(IList<PackageContent> products)
donde PackageContent es
class PackageContent
{
int ProductId{get;set;}
int Quantity{get;set;}
}