我的MVC项目Order
和Product
中有两个课程。
因为Product
可以多次订购而且Order
可以有很多产品,所以我有第三个实体OrderedProduct
。它以多对多的关系加入这两个实体。
现在我要做的是让用户通过将下拉列表中的产品放到框中然后保存我的订单来下订单。客户还必须填写订单实体中的一些文件,例如地址数据等。我想要的是将它全部放在一个页面上。用户可以根据需要从下拉列表中添加任意数量的项目,然后他可以添加整个订单。
为了更容易想象看这张图片:
Layout http://img245.imageshack.us/img245/4618/myimage.png
现在的问题是如何在我的MVC应用程序中实现这种行为。我应该构建一个结合Order
类和Product
列表的ViewModel,还是使用Product
类的部分视图?
这也是我的主要问题,我怎样(以优雅的方式)在POST请求后检索控制器中所选产品的完整列表或至少产品ID?在这种情况下,我如何指定我发送的是一组ID?添加一个对象很简单,但整个集合呢?
这是我不完全理解asp.net MVC的地方,所以请给我一些好主意;)向大家致以问候,感谢您对所有答案的建议!
答案 0 :(得分:2)
所需的界面对我来说似乎有点混乱,但这里是你如何处理这些事情。修改你的愿望。我将假设OrderedProduct
是一个订购对象,其中包含产品ID和数量和,您希望它们能够同时修改它们。
将Order
设为您的ViewModel。鉴于它有一个名为List<OrderedProduct>
的{{1}}属性:
创建一个ViewModel为OrderedProducts
的小编辑器控件。没有表单,只是文本框/下拉列表/绑定到产品名称属性的任何内容以及绑定到产品数量的文本框。 重要:将此控件放在views / shared / EditorTemplates中,并将其命名为OrderedProduct.ascx。
为您的OrderedProduct
对象提供Order
类型NewOrderedProduct
的属性。
在OrderedProduct
视图的格式中执行:Order
这将为您提供订单中当前项目的可编辑列表。
之后:<%=Html.EditorFor(m=>m.OrderedProducts)%>
这是您可以添加新项目的地方
让[POST]操作采用<%= Html.EditorFor(m=> m.NewOrderedProduct) %>
类型。
现在,当提交Order
属性有效时,您可以将其添加到NewOrderedProduct
列表并重新显示。您可以通过这种方式添加任意数量的内容,并且它们都可以自动发送。
在表单中有一个单独的提交按钮用于提交订单。检查[POST]中是否存在该按钮的名称,并一次提交所有内容。
这将为您提供一个直接的HTML工作版本。从那里你可以根据需要进行Ajax化。
修改强>
更新以反映OrderedProducts
对象的功能并更正帖子接受的类型