我相信這已經在別的地方得到了回答,但我似乎無法在任何地方找到明確的發佈。分層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模型上,其中動作將模型傳遞給視圖。在一天結束時,我仍然需要向我的用戶展示網頁...
我明白了嗎?我失蹤的任何其他策略?這必須是一個相當常見的情況,所以我很驚訝,我還沒有找到大量的文章。
我簡化了一些例子,但在我的情況下,我實際上需要把它帶到第三級---合同/訂單/項目。
感謝
偉大的問題,+1! –