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