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

时间:2011-04-16 20:59:47

标签: asp.net asp.net-mvc actionmethod

我刚刚开始学习ASP.NET MVC 3.我一直在浏览ASP.NET网站上的音乐商店示例,以及开始开发我自己的网站,但我遇到了一些麻烦了解我应该如何设置我的控制器动作方法。

在我的网站上,每个登录的用户都可以在他们的项目上执行标准的CRUD操作。我在ProjectController上使用以下操作方法将其设置为类似于Music Store示例。到目前为止,这对我来说很有意义。

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”模型对象,该对象包含对新Item的引用以及它被添加到的项目吗?

一旦表单知道哪个项目正在添加一个项目,它应该在提交时如何传回这些信息?表格中是否应该隐藏“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

2 个答案:

答案 0 :(得分:0)

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

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

通常你也会使用强类型的viewmodel,所以使用FormCollection参数:

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

只要name属性与Item或ItemViewModel中的属性匹配,MVC的ModelBinder将负责保护这些值。

答案 1 :(得分:0)

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

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版本。话虽这么说,如果Items不是独立于Project对象存在的话,我会更有可能这样做。但是,如果您要在Item上执行可以执行的不同操作的TON,则将它们分成ItemController和ProjectController是有意义的。

它在很大程度上归结为对您的应用程序有意义的内容以及您认为控制器应该对其执行的操作数量。