2011-04-16 47 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的模型綁定器會照顧保持這些價值。