需要帮助设计ASP.NET MVC操作方法

| 我刚开始学习ASP.NET MVC3。我一直在研究ASP.NET网站上的音乐商店示例,以及开始开发自己的网站,但是遇到了一些麻烦了解如何设置我的控制器操作方法。 在我的网站上,每个登录的用户将能够在其项目上执行标准的CRUD操作。我已经将其设置为类似于Music Store示例,并在ProjectController上使用以下操作方法。到目前为止,这对我来说很有意义。
ActionMethod                                          View
ProjectController.Index()                            Lists the active users\'s projects
ProjectController.Details(int id)                    Shows details for project 123
ProjectController.Create()                           Shows a form to edit a new project
ProjectController.Create(FormCollection col)         Adds a new project with the form contents
ProjectController.Edit()                             Shows a form to edit a new project
ProjectController.Edit(int id, FormCollection col)   Adds a new project with the form contents
ProjectController.Deiete(int id)                     Shows a delete confirmation form
ProjectController.Delete(int id, FormCollection col) Deletes a project with the provided id.
此外,用户将能够将项目添加到每个项目。项目不能单独存在,并且在创建时必须与项目关联。我无法理解的是如何将对项目的引用传递到应该在其中创建项目的项目。例如,在我的项目控制器中,我有一对类似于上面的控制器的Create()操作方法。
ItemController.Create()                               Shows a form to create a new item
ItemController.Create(FormCollection col)             Creates a new item with the details from the form.
但是我不明白第一个Create()方法如何将引用传递给应该在其中创建新Item的项目,因为View()帮助器方法只能接受一个对象参数。我是否应该在ViewBag的属性中添加对项目的引用?我也是动态类型的新手,而ViewBag对我来说似乎很神奇。所以我有点犹豫使用它。我也一直认为强类型设计会更好。因此,我是否应该创建一个单独的“ NewItemData”模型对象,该对象包含对新项以及要添加到的项目的引用? 一旦表单知道哪个项目,它将添加一个项目到提交时如何传递此信息?表单中是否应该有一个隐藏的“ ProjectID”字段?还是应该将表单POST返回到查询字符串中带有项目ID的URL?
www.mysite.com/Item/Create?ProjectID=1234 
最后,我还希望能够列出添加到每个项目中的项目。它应该是ItemController还是ProjectController的一部分。为简单起见,我坚持使用默认的Controller \\ Action [ID] URL路由。下面列出了我的一些想法。我倾向于最后一种选择,但是我真的很想听听其他对此内容有更多经验的人的看法。
Action Method                          URL
ItemController.Index(int ProjectID)    \\Item?ProjectID=1234    
ItemController.List(int id)            \\Item\\List\\1234         
ProjectController.Items(int id)       \\Project\\Items\\1234
    
已邀请:
要回答您的最后一个问题,这取决于。模型中的项目是否独立于项目而存在?如果答案是否定的,那我倾向于
ProjectController.AddItem(int id)
ProjectController.Items(int id)
其中,id代表projectID。 在动作签名中使用的参数名称直接对应于routedata和请求值中的值。 {controller} / {action} / {id}是一种使用括号名称作为路由字典中的键的模式。如果您愿意,可以将该操作的路由更改为{controller} / {action} / {projectid},并且您的方法签名可以是(int projectid)签名。 我不建议您这样做只是为了获得出色的签名。如果您认为人们会感到困惑,请改用评论。 在不更改路由模式的情况下,如果您希望您的网址是/ project / items?projectid = 3,而不是/ project / items / 3,则操作将是这样的:
ProjectController.Items(int projectId)
我喜欢漂亮的网址,因此我更倾向于使用id版本。话虽这么说,如果Item并不独立于Project对象而存在,那么我将更有可能这样做。但是,如果您要对一个项目执行大量不同的操作,则将它们分为ItemController和ProjectController是有意义的。 它很大程度上取决于关于什么对您的应用程序有意义,以及您认为控制器应对其执行多少操作。     
在这种情况下,您将使用
name=projectId
创建一个隐藏字段,然后在“创建”控制器中使用一个操作方法。
[HttpPost]
public ActionResult Create( int projectId, FormCollection postData )
通常,您还会使用强类型的视图模型,因此FormCollection参数将使用:
[HttpPost]
public ActionResult Create( int projectId, Item or ItemViewModel postData )
只要ѭ9属性与Item或ItemViewModel中的属性匹配,MVC的ModelBinder就会对这些值进行补水。     

要回复问题请先登录注册