就我的问题提供一些背景信息:
我有 3 个表,分别称为 Products、Packages 和 PackageContents。我可以进入我的应用程序并添加产品,然后我可以从中创建包。设置包的步骤之一是创建所有包内容。为此,我创建了一个贯穿所有产品的视图,并为每个产品设置了一个新的包内容 - 将 packageID 和 productID 放置在隐藏字段中。然后,用户可以为每个选项选择一个下拉列表,以指示产品是否在包装中。
这是我的问题:
这会为每个产品呈现一个单独的表单,每个产品都有自己的保存按钮。我想要一个提交按钮,可以一次保存所有新的包内容。有人可以给我一个例子,说明如何编写我的 POST 方法来循环并保存所有新的包内容,以及如何在我的视图中创建一个按钮来一次保存所有这些内容?
我的模型:
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 });
}