2012-10-16 68 views
0

我相信這已經在別的地方得到了回答,但我似乎無法在任何地方找到明確的發佈。分層MVC路由策略

大多數關於分層路由的帖子都是關於何時需要Url中無限數量的令牌。我的問題更多地涉及何時沒有在另一個實體的背景下與某個特定實體存在關聯的情況下沒有意義。

例如,我有一個合同實體以及預期的合同控制人。它具有索引,編輯,創建等標準操作。我的網址看起來像

/Contracts/     ' list all contracts 
/Contracts/Create/   ' display form to create new contract 
/Contracts/Edit/87Y5r3/  ' display form to edit contract 87Y5r3 

現在想象一下,我訂購的實體必須與給定的合同相關聯。使用(幾乎)默認路由我會的

/Orders/       ' display all orders across all contracts 
/Orders/Index/87Y5r3    ' display all orders for contract 87Y5r3 
/Orders/Create/87Y5r3    ' display form to create new order for contract 87Y5r3 
/Orders/Edit/87Y5r3/45   ' display form to edit order 45 under contract 87Y5r3 

我當然可以保留默認幾乎同時路由調整它支持類似合同號和訂單號額外參數的URL。

或者我可以更改我的路由以顯示Orders屬於層次結構中的Contracts。正如我所看到的,我有幾條路要走:

1)有一個控制器可以處理合同和訂單以及許多用於將動作映射到方法的自定義路由。這使我沿着

/Contracts/      ' maps to Index action in the Contract controller 
/Contracts/Create/     ' maps to Create action in the Contract controller 
/Contracts/Orders/     ' maps to IndexOrders action in the Contract controller 
/Contracts/Orders/Index/87Y5r3  ' maps to IndexOrders action in the Contract controller 
/Contracts/Orders/Edit/87Y5r3/45 ' maps to EditOrders action in the Contract controller 

行網址數,而我無法想象任何好的論據只具有單一的控制器,我猜測,這個好還可以分成合同控制器,並用適當的路線的訂單控制器(S)。

要點在於合同編號即將到達網址的末尾。

2)另一種選擇是單獨的控制器,但具有以下URL。這對我來說似乎更自然(合乎邏輯)。

/Contracts/        ' maps to Index action in the Contract controller 
/Contracts/Create/      ' maps to Create action in the Contract controller 
/Contracts/?????/87Y5r3/Orders/Index/ ' maps to Index action in the Order controller 
/Contracts/?????/87Y5r3/Orders/Edit/45 ' maps to Edit action in the Order controller 
/Contracts/?????/All/Orders/    ' maps to Index action in the Order controller 

在這種情況下,合同編號來在URL中的令牌合同與訂單號接近尾聲到來之後。我已經確定了一些問題/問題

  • 如何處理跨越所有合同的訂單數據。正如你所看到的,通過一個特殊的「全部」令牌來處理它。

  • 我對網址的合同部分採取了什麼行動?默認情況下,Mvc中的路由是/ {controller}/{action}/{id}。

3) 我已經看到張貼(但不明白不足以評估利弊)第三個選擇是使用基於REST的API。我相信這可以(可以解決)我的第二個問題,即在使用訂單時使用什麼合約行爲。其基本思想是將動作替換爲一個HTTP動詞,如DELETE或PUT,它只需要應用於Url末尾的實體。

在這種情況下,我最終會像

GET /合同/「映射到合同控制器Index操作 POST /合同/創建/」地圖創建的合同控制器動作 GET /合同/ 87Y5r3 /訂單/'映射到訂單控制器中的索引動作 PUT /合同/ 87Y5r3 /訂單/ 45'映射到訂單控制器中的編輯動作 GET /合同/全部/訂單/訂單控制器

雖然RESTful可能是我走的路我絕對不知道它和我最初的反應是它增加了複雜性和限制(有多少動詞在那裏?),可能會限制它的用處。

基於我的快速閱讀,使用RESTful方法(包括下面的@Robotsushi建議的ASP.NET Web API)並不能真正回答我的問題。如果我的頁面通過AJAX和JSON請求數據,RESTful似乎是需要考慮的事情。從這個意義上說(只要求數據)它提供了一個Url的方法。然而,我的問題更多地集中在標準的MVC模型上,其中動作將模型傳遞給視圖。在一天結束時,我仍然需要向我的用戶展示網頁...

我明白了嗎?我失蹤的任何其他策略?這必須是一個相當常見的情況,所以我很驚訝,我還沒有找到大量的文章。

我簡化了一些例子,但在我的情況下,我實際上需要把它帶到第三級---合同/訂單/項目。

感謝

+0

偉大的問題,+1! –

回答

-1

這純粹是我意見

我會建議您使用Web服務。如果你不能,你仍然可以使用HTTP POST。發送複雜的數據結構會更容易,而不會混淆具有大量非結構化鍵/值對的URL。

如果您使用此策略,您將能夠發送XML或JSON作爲您的數據結構,並獲得您可能需要的複雜實體表示。

如果您不熟悉基於HTTP的Web服務,請查看ASP.NET Web API

好運

編輯 您可以HTTP POST數據到你的MVC控制器。如果你這樣做,那麼你可以使用一個複雜的序列化格式,如XML或JSON來發送你的數據。這將允許您的實體需要的分層嵌套。

我應該對Web服務更加清楚。您正在執行的操作類型看起來好像在Web服務中可能會更好。但是,無論您是否選擇使用Web服務,您的mvc控制器都可以使用HTTP POST操作正確表示數據。

我希望這會有所幫助。

+1

現在是ASP.NET Web API,正如鏈接上明亮的黃色橫幅所示。 –

+0

請詳細解釋。 ASP.NET Web API和JSON如何與我的ASP.NET MVC路由問題相關聯?我仍然需要在瀏覽器中向用戶呈現Urls。 (是的...我會閱讀你添加的鏈接,但是擴展你的回覆的幾句話應該提供澄清。) – Jason

+0

我投票拒絕了這個,因爲雖然關於Web服務的數據可能對其他項目有幫助,但我只是看不到它如何解決我的Url問題。無論是作爲頁面的一部分執行同步回發還是將回發轉換爲針對Web服務的Ajax,我仍然需要向用戶呈現分層(或至少是邏輯)url路徑。 – Jason