为分层系统设计MVC URL方案

时间:2009-11-12 21:06:38

标签: model-view-controller theory asp.net-mvc-routing hierarchical-data

想象一下,我正在使用MVC Web应用程序构建一个多用户地牢系统。为了描述玩家可以探索的区域,系统可以包含许多地图,其中包括房间和门 - 其中门连接两个房间。 考虑系统的创作部分。创建地图很简单 - 我需要以下网址:

/Author/Maps              (an index of my maps)
/Author/Maps/Create       (a new Map)
/Author/Maps/Detail/3     (show Map details)
/Author/Maps/Edit/3       (edit map details)

使用路由方案:/ Author / {controller} / {action} / {ID}

这是我需要帮助的房间的网址。在创建新房间时,我需要知道我正在创建它的地图。

/Author/Rooms/CreateIn/[mapID] ?

然后编辑房间的详细信息:

/Author/Rooms/Edit/[roomID]
/Author/Rooms/Detail/[roomID]

此路由方案是否有效?列出Map的所有房间的视图是否应该是Rooms控制器上的“Index”操作,传入MapID或Map控制器上的“Rooms”操作?

感谢。

1 个答案:

答案 0 :(得分:5)

我不知道这是不是最佳做法,但我会这样做:

添加新路线:/Author/Maps/{mapID}/Rooms/{action}/{roomID}

由于这是我只希望用于RoomsController的路由,因此我在该路由中不会有{controller}参数。只需将控制器设置为路径默认对象中的“房间”。

然后,您的RoomsController中的所有操作都会知道他们正在使用哪个地图。

RoomsController的默认索引操作可以是指定地图的所有会议室的列表。

“创建”操作看起来像Create(int mapID),“详细信息”操作看起来像Details(int mapID, int roomID)

编辑关于mapID和roomID不匹配的无效网址,您可以忽略mapID,但我认为更好的流程是验证指定的mapID是否正确并显示错误消息如果不是。

编辑2:(关于mapID和roomID之间关系的其他想法) 你可以在给定的地图中使roomID唯一。因此,地图5,房间3将是与地图8,房间3不同的房间。