保存了一系列的创建形式与一个在ASP.Net MVC提交按钮
-
13-09-2019 - |
题
要给予一定的背景上我的问题:
我有3个表称为产品,包和PackageContents。我可以在我的应用程序并添加产品,然后我可以创建包了出来。一个建立包的步骤是创建的所有包的内容。要做到这一点,我已经创建了一个通过所有的产品的运行,并建立每个新包的内容视图 - 放置包标识和中的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 });
}
解决方案
在这里你可以看到绑定到一个列表:的模型结合到列表
这文章是旧的,在新版本的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;}
}
不隶属于 StackOverflow