문제

내 문제에 대한 배경 지식을 제공합니다.

제품, 패키지 및 패키지 컨텐츠라는 3 개의 테이블이 있습니다. 응용 프로그램에 가서 제품을 추가 한 다음 패키지를 만들 수 있습니다. 패키지 설정 단계 중 하나는 모든 패키지 내용을 만드는 것입니다. 이를 위해, 나는 모든 제품을 실행하는 뷰를 만들고 각각의 패키지와 제품을 숨겨진 필드에 배치하는 각각의 새로운 패키지 컨텐츠를 설정합니다. 그런 다음 사용자는 제품이 패키지에 있는지 여부를 표시하기 위해 각각의 드롭 다운을 선택할 수 있습니다.

내 문제는 다음과 같습니다.

이렇게하면 모든 제품에 대해 별도의 양식을 제공하며 각 제품은 자체 저장 버튼이 있습니다. 모든 새 패키지 내용을 한 번에 저장하는 제출 버튼 하나가 있습니다. 누군가가 내 게시물을 작성하여 모든 새 패키지 내용을 저장하기 위해 내 게시물 메소드를 작성하는 방법과 한 번에 저장하는 버튼을 만드는 방법에 대한 예를 제시 할 수 있습니까?

내 모델 :

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" />, 그러나 나머지는 유효합니다.

편집하다

의견에 대한 답변 :

제품이 패키지에 있든 없든 상관없이 선택하는 것만 선택하는 경우 MultiSelectList를 사용할 수 있습니다.

수량 또는 기타 Attibutes를 지정하려면 다음을 작성할 수 있습니다.

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