C# 如何在ASP.NET MVC中保存以表单编辑的多个模型?
我需要做一个视图,它将支持批量插入对象。我正在实体框架4中使用存储库模式 由于视图中将有多个单独的模型,我如何处理将视图的模型绑定到发送到存储库的get 如何将表单中的输入值检索到控制器中C# 如何在ASP.NET MVC中保存以表单编辑的多个模型?,c#,asp.net-mvc,entity-framework-4,bulkinsert,C#,Asp.net Mvc,Entity Framework 4,Bulkinsert,我需要做一个视图,它将支持批量插入对象。我正在实体框架4中使用存储库模式 由于视图中将有多个单独的模型,我如何处理将视图的模型绑定到发送到存储库的get 如何将表单中的输入值检索到控制器中 我已设法进行查看,但无法从控制器检索数据。我使用了下面的语句,但在post之后,它是nul public ActionResult AddPaymentForRoot_post(PaymentViewModelObject payments) { return null;
我已设法进行查看,但无法从控制器检索数据。我使用了下面的语句,但在post之后,它是nul
public ActionResult AddPaymentForRoot_post(PaymentViewModelObject payments) {
return null;
}
我还没有使用EF,但我在我们的网站上有类似的要求。我通过将视图指定为继承
System.Web.Mvc.ViewPage
,然后使用for循环构建多个输入部分,利用允许模型绑定器构建可枚举项所需的命名约定来实现这一点
我更喜欢创建具有可枚举属性的视图模型(请参见下面的更新2)。在本例中,我们可以说它是MyViewModel
对象,具有名为MyModelObjects
的IEnumerable
属性。在这种情况下,视图将显示如下
具体地说,请确保为每个输入部分包含一个名为MyModelObjects.Index
的隐藏字段,然后将属性输入命名为MyModelObjects[0].MyProperty
,其中Index
隐藏字段的值对应于属性名称中的数组索引
您最终得到的结果如下所示,例如:
<div>
<input type="hidden" name="MyModelObjects.Index" value="0" />
Name: <input type="text" name="MyModelObjects[0].Name" /><br />
Value: <input type="text" name="MyModelObjects[0].Value" />
</div>
<div>
<input type="hidden" name="MyModelObjects.Index" value="1" />
Name: <input type="text" name="MyModelObjects[1].Name" /><br />
Value: <input type="text" name="MyModelObjects[1].Value" />
</div>
<div><a href="#" id="addItem">Add another item</a></div>
更新2
上面有一点错误-如果将视图键入到
IEnumerable
,则字段名将仅为索引和[0]。名称
/[0]。值
。在我的实际应用程序中,我使用了一个视图模型,该模型的属性本身是可枚举的,因此我实际上将我的页面键入为
。在上面的示例中,该视图模型对象将具有一个名为MyModelObject
的属性,该属性将是可枚举的(更现实地说,它被称为MyModelObjects
复数)。哇,我以前没有这样想过。这是个好主意。我没有尝试过,但逻辑对我来说是有意义的,并且非常确定它会起作用。你能给我一个关于jquery代码克隆模板输入部分的提示吗?顺便说一下,非常感谢。这对我来说意义重大。添加了代码。请记住,控制器必须接受模型,并且必须在集合中插入每个项目。
<div id="templateDiv" style="display: none;">
<input type="hidden" name="MyModelObjects.Index" value="0T" />
Name: <input type="text" name="MyModelObjects[0T].Name" /><br />
Value: <input type="text" name="MyModelObjects[0T].Value" />
</div>
var currentIndex = 1 // if you were using this for editing, this would be dynamically set to the number of items you have
var doAddItem =
function() {
currentIndex++;
var newItem = $("#templateDiv").clone();
newItem.attr("id", "item" + currentIndex); // reset the ID here
newItem.find("input[name=MyModelObjects.Index]").val(currentIndex);
newItem.find("input[name$=.Name]").attr("name", "MyModelObjects[" + currentIndex + "].Name");
newItem.find("input[name$=.Value]").attr("name", "MyModelObjects[" + currentIndex + "].Value");
newItem.insertBefore($(this).closest("div")); // insert it before the div containing the add link...adjust appropriate to your layout
return false;
}
$(document).ready(function() {
$("#addItem").click(doAddItem);
// In a real-world app you'd probably want to have a delete option, too
});