2011-02-10 52 views
1

我需要制作一个支持大量插入对象的视图。我在实体框架4中使用存储库模式。如何在ASP.NET MVC中保存多个在窗体中编辑的模型?

由于视图中会有多个单独的模型,因此如何处理将视图的模型绑定到发送到Repository的内容?

如何从表单中将输入值检索到控制器中?


我设法做了视图,但我无法从控制器检索数据。我用了如下因素语句,但后门柱它heppens是NUL

public ActionResult AddPaymentForRoot_post(PaymentViewModelObject payments) { 


     return null; 

    } 

回答

2

我没有使用EF,但我对我们网站的类似要求。我通过将视图指定为继承System.Web.Mvc.ViewPage<IEnumerable<MyModelObject>>来完成它,然后使用for循环来构建多个输入节,并利用所需的命名约定来允许模型联编程序构建枚举。

我更喜欢使用属性是可枚举的(参见下面的更新2)创建视图模型。在这个例子中,我们可以说MyViewModel对象的IEnumerable<MyModelObject>属性叫做MyModelObjects。在这种情况下,视图会特别发挥出如下...

,确保包括每个输入部分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> 

在某些情况下,我也有JavaScript的(在上面的标记锚链接触发),将克隆的模板输入部分,修改名称以填充索引值,并将其添加到DOM。用这种方式,用户可以动态地向记录添加记录。

根据您处理模型的方式,您还可以传入具有IEnumerable属性的ViewModel。视图的打字会改变,但从根本上来说,视图的设计不会。

UPDATE 使用上面的示例,下面是用于添加项目的jQuery代码的快速片段。我假设这是一个插入,但如果你想支持这种类型的界面进行编辑,请注意注释。

首先,我设置了一个模板。虽然这可以完全用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> 

你也可以在那里指定ID ...可能是一个很好的做法,但为了简洁起见,我将省略这个例子。

有了这一点,你可以设置jQuery的功能如下:

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 
}); 

更新2 有一点错误在那里 - 如果你的观点是输入到IEnumerable<object>那么你的字段名将最终成为Index[0].Name/[0].Value。在我的实际应用程序中,我使用了一个视图模型,该模型本身就是一个可枚举的属性,所以实际上我的页面类型为<MyViewModelObject>。在上面的示例中,该视图模型对象将具有名为MyModelObject的属性,该属性将是可枚举的(更现实地称为MyModelObjects复数)。

+0

哇,我从来没有这样想过。这是一个完美的想法。我没有尝试,但逻辑对我来说很有意义,而且很确定它会起作用。你能给我一个关于jQuery代码的提示来克隆一个模板输入部分吗?非常感谢。这对我来说意味着很多。 – tugberk 2011-02-10 15:33:09

相关问题