在 ASP.Net MVC 中使用一个提交按钮保存一系列创建表单
Posted
技术标签:
【中文标题】在 ASP.Net MVC 中使用一个提交按钮保存一系列创建表单【英文标题】:Saving a series of create forms with one submit button in ASP.Net MVC 【发布时间】:2009-12-05 18:51:04 【问题描述】:提供一些关于我的问题的背景:
我有 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 );
【问题讨论】:
【参考方案1】:您可以在此处阅读有关绑定到列表的信息:Model binding to a list
这篇文章比较老了,在较新的MVC版本中你不必定义<input type="hidden" name="products.Index" value="0" />
,但其余的都是有效的。
编辑
回复评论:
如果您只是选择产品是否在包装中,则可以使用 MultiSelectList。
如果要指定数量或其他属性,可以写:
<% 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 ProductIdget;set;
int Quantityget;set;
【讨论】:
这对一些人有帮助,但我正在尝试弄清楚如何编写我的 post 方法。如何更改上面的视图代码,为每个产品创建一个新的包内容,然后将所有新包内容传递到我的 post 方法,然后我可以在其中编写一个循环,将每个新包内容保存在包内容中? LukLed,我终于得到了想要的结果(现在是凌晨 4 点 30 分)。感谢您在这方面的帮助,我可以补充一点,我发现另一篇文章 kristofmattei.be/2009/10/19/asp-net-mvc-model-binding-to-a-list 也有帮助。现在我必须决定天气我要赢了,还是我应该继续使用我新学到的技能并可能再次挂断电话?!?谢谢!以上是关于在 ASP.Net MVC 中使用一个提交按钮保存一系列创建表单的主要内容,如果未能解决你的问题,请参考以下文章
jQuery Validate:在 ASP.NET MVC 5 应用程序中添加事件以提交按钮单击