2011-04-16 77 views
0

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

在我的网站上,每个登录的用户都能够在他们的项目上执行标准的CRUD操作。我已经在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()方法传递到新的项目应自该视图()辅助方法来创建于只能接受一个对象参数的项目的引用。我应该只是将对项目的引用添加到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 

回答

0

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

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

其中id代表projectID。

您在动作签名中使用的参数名称直接对应于路由数据和请求值中的值。{controller}/{action}/{id}是一个模式,它在路由字典中使用支撑名称作为键。如果你想要,你可以改变路由为{controller}/{action}/{projectid},你的方法签名可以是(int projectid)签名。

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

不改变路由模式,如果您希望您的网址是/项目/项专案编号= 3比/项目/项/ 3则动作会是这样:

ProjectController.Items(int projectId) 

我喜欢漂亮的网址,所以我会更倾向于使用id版本。也就是说,如果Items不独立于Project对象存在,我将更有可能这样做。但是,如果您要对某个Item执行不同操作的TON,将它们分离为ItemController和ProjectController是有意义的。

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

+0

是的你是对的,项目不能与项目一起存在,所以你的例子非常有意义。尽管我认为对于项目特定的操作(如查看项目详细信息,编辑和项目)仍然有单独的ItemController也是有意义的。但是留下创建和删除项目到项目控制器,因为实际上我总是添加项目或从项目中删除项目。 – 2011-04-17 01:38:40

0

在这种情况下,你创建一个隐藏字段与name=projectId,然后在创建控制器有一个动作方法。

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

通常,你也最好使用强类型的视图模型,从而代替的FormCollection参数使用:

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

而且只要name属性项的属性匹配或ItemViewModel MVC的模型绑定器会照顾保持这些价值。