Asp.net mvc 在ASP.NETMVC中使用一个提交按钮保存一系列创建表单
以下是我的问题的一些背景: 我有三个表,分别是Products、Packages和PackageContents。我可以进入我的应用程序并添加产品,然后我可以用它们创建包。设置包的步骤之一是创建所有包内容。为此,我创建了一个贯穿所有产品的视图,并为每个产品设置了一个新的包内容——将packageID和productID放在隐藏字段中。然后,用户可以为每个产品选择一个下拉列表,以指示产品是否在包装中 这是我的问题: 这将为每个产品呈现一个单独的表单,每个产品都有自己的保存按钮。我想有一个提交按钮,一次保存所有的新包内容。有人能给我一个例子,说明如何编写我的POST方法来循环并保存所有新的包内容,以及如何在视图中创建一个按钮,一次保存所有内容 我的模型:Asp.net mvc 在ASP.NETMVC中使用一个提交按钮保存一系列创建表单,asp.net-mvc,forms,views,form-submit,Asp.net Mvc,Forms,Views,Form Submit,以下是我的问题的一些背景: 我有三个表,分别是Products、Packages和PackageContents。我可以进入我的应用程序并添加产品,然后我可以用它们创建包。设置包的步骤之一是创建所有包内容。为此,我创建了一个贯穿所有产品的视图,并为每个产品设置了一个新的包内容——将packageID和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;
}
}
}
观点:
包装:
受限制的:
编辑
我决定发布最终为我工作的代码,以防其他人出现并需要同样的帮助:
我的看法是:
<% 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 ActionResult AddContents(int id)
{
Package package = customerRepository.GetPackage(id);
return View(new PackageContentViewModel(id) { });
}
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 });
}
公共重定向路由结果CreateContents(int-id,IList-PackageContents)
{
Package Package=customerRepository.GetPackage(id);
foreach(PackageContents中的var packageContent)
{
customerRepository.Add(packageContent);
customerRepository.Save();
}
返回RedirectToAction(“SetPrice”,new{id=package.PackageID});
}
在这里,您可以阅读有关绑定到列表的内容:
这篇文章很老,在较新的MVC版本中,您不必定义
,但其余的都是有效的
编辑
对评论的答复:
如果您只需选择产品是否在包中,则可以使用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; } %>
<% } %>
这有一些帮助,但我正在尝试如何编写我的post方法。我如何修改上面的视图代码,为每个产品创建一个新的包内容,然后将所有新包内容传递到我的post方法中,在那里我可以编写一个循环,将每个新包内容保存在包内容中?LukLed,我终于得到了想要的结果(现在是凌晨4:30)。我感谢你在这方面的帮助,我可以补充一点,我发现另一篇文章也帮助了一些人。现在我必须决定我是要带着胜利上床睡觉,还是应该继续使用我新学到的技能,并可能再次挂断电话?!?谢谢
<% 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)
class PackageContent
{
int ProductId{get;set;}
int Quantity{get;set;}
}