0

我刚刚开始学习 ASP.NET MVC 3。我一直在浏览 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
4

2 回答 2

0

在这种情况下,您将创建一个隐藏字段,name=projectId然后在您的 Create 控制器中有一个操作方法。

[HttpPost]
public ActionResult Create( int projectId, FormCollection postData )

通常您还会使用强类型视图模型,因此 FormCollection 参数使用:

[HttpPost]
public ActionResult Create( int projectId, Item or ItemViewModel postData )

只要name属性与 Item 或 ItemViewModel 中的属性匹配,MVC 的 ModelBinder 就会处理这些值。

于 2011-04-16T22:00:10.947 回答
0

要回答你的最后一个问题,这取决于。模型中的项目是否独立于项目而存在?如果答案是否定的,那么我倾向于这样做

ProjectController.AddItem(int id)
ProjectController.Items(int id)

其中 id 代表项目 ID。

您在操作签名中使用的参数名称直接对应于路由数据和请求值中的值。{controller}/{action}/{id} 是一种使用大括号名称作为路由字典中的键的模式。如果您愿意,您可以将路线更改为该操作的 {controller}/{action}/{projectid} 并且您的方法签名可以是(int projectid)签名。

我不建议您这样做只是为了获得很棒的签名。如果您认为人们会感到困惑,请改用评论。

在不更改路由模式的情况下,如果您希望您的网址是 /project/items?projectid=3 而不是 /project/items/3,那么操作将是这样的:

ProjectController.Items(int projectId)

我喜欢更漂亮的网址,所以我更倾向于使用 id 版本。话虽如此,如果 Items 不独立于 Project 对象存在,我更有可能这样做。但是,如果您要对一个 Item 执行大量不同的操作,则将它们分成 ItemController 和 ProjectController 是有意义的。

它在很大程度上取决于什么对您的应用程序有意义以及您认为控制器应该对其执行多少操作。

于 2011-04-16T23:00:26.127 回答