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 });
    }
¿Fue útil?

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;}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top