حفظ سلسلة من إنشاء النماذج مع زر إرسال واحد في ASP.NET MVC

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

سؤال

لإعطاء بعض الخلفية حول مشكلتي:

لدي 3 طاولات تسمى المنتجات والتعبئة والبازلاء. يمكنني الذهاب في طلبي وإضافة منتجات، ثم يمكنني إنشاء حزم منهم. واحدة من خطوات إعداد الحزمة هي إنشاء جميع محتويات الحزمة. للقيام بذلك، قمت بإنشاء طريقة عرض تقوم بالتشغيل من خلال جميع المنتجات وإعداد محتوى حزمة جديد لكل - وضع حزمة ProductID والمنتج في الحقول المخفية. ثم يمكن للمستخدم تحديد منسرة لكل واحد للإشارة إلى ما إذا كان المنتج في الحزمة، أم لا.

إليك مشكلتي:

هذا يجعل شكل منفصل لكل منتج، كل منها زر حفظه الخاص. أود الحصول على زر إرسال واحد يحفظ جميع محتويات الحزمة الجديدة مرة واحدة. هل يمكن لشخص ما أن يعطيني مثالا على كيفية كتابة طريقة مشترياتي لحلقة وحفظ جميع محتويات الحزمة الجديدة وكيفية صنع زر في رأيي الذي يحفظ كل منهم في وقت واحد؟

مثالي:

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;

            }
        }
    }

المتحكم:

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

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

المنظر:

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

    <% } %>

<% } %>

تعديل

قررت نشر الرمز الذي انتهى بالعمل بالنسبة لي، في حالة يأتي أي شخص آخر ويحتاج إلى نفس المساعدة:

وجهة نظري:

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

<% } %>

جهاز التحكم الخاص بي:

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 });
    }
هل كانت مفيدة؟

المحلول

هنا يمكنك قراءة حول الربط إلى القائمة: نموذج ملزم إلى قائمة

هذه المقالة قديمة، في إصدار MVC الأحدث، ليس عليك تحديد <input type="hidden" name="products.Index" value="0" />, ، ولكن الباقي صالح.

تعديل

الإجابة على التعليق:

إذا كان الشيء الوحيد الذي تقوم به هو تحديد ما إذا كان المنتج موجودا في الحزمة أم لا، يمكنك استخدام قائمة متعددة الاستخدامات.

إذا كنت ترغب في تحديد كمية أو العانيات الأخرى، يمكنك الكتابة:

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

العمل بعد:

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

حيث packageContent هو

class PackageContent
{
    int ProductId{get;set;}
    int Quantity{get;set;}
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top