4

Imaginez donc que je construis un système Multi User Dungeon en utilisant une application web MVC. Pour décrire les zones que le joueur peut explorer, le système peut contenir un certain nombre de cartes, composées de chambres et de portes - où les portes relient deux salles. Considérer la partie de création du système. Pour créer une carte est facile - je besoin URL comme:Conception d'un schéma d'URL MVC pour un système hiérarchique

 
/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) 

utilisant un schéma de routage:/Auteur/{contrôleur}/{action}/{ID}

Ce sont les URL pour les chambres que je besoin d'aide avec. Lorsque je crée une nouvelle salle, j'ai besoin de savoir pour quelle carte je la crée.

 
/Author/Rooms/CreateIn/[mapID] ? 

Et pour l'édition des détails d'une pièce:

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

Est-ce que ce travail de système de routage? Et la vue qui répertorie toutes les pièces d'une carte doit-elle être une action "Index" sur le contrôleur Rooms, avec un MapID transmis, ou une action "Rooms" sur un contrôleur Map?

Merci.

Répondre

5

Je ne sais pas si cela est la meilleure pratique, mais je le ferais comme ceci:

Ajouter un nouvel itinéraire: /Author/Maps/{mapID}/Rooms/{action}/{roomID}

Depuis c'est une route que je ne vous attendre à utiliser pour le RoomsController, je n'aurais pas de paramètre {controller} dans cette route. Réglez simplement le contrôleur sur "Rooms" dans l'objet par défaut de la route. Ensuite, toutes les actions dans votre RoomController sauront avec quelle carte ils travaillent. L'action d'index par défaut de RoomsController peut être une liste de toutes les pièces de la carte spécifiée.

L'action Créer ressemblerait Create(int mapID) et l'action Détails ressemblerait Details(int mapID, int roomID)

Edit: en ce qui concerne les URL non valides avec un mapID ne correspondent pas et RoomID, vous pouvez simplement ignorer le mapID, mais je pense que le meilleur processus serait de valider que le mapID spécifié est correct et afficher un message d'erreur si ce n'est pas le cas.

Edit 2: (pensées supplémentaires en ce qui concerne la relation entre mapID et RoomID) Vous pouvez tout simplement faire RoomID unique dans la carte donnée. Par conséquent, la carte 5, salle 3 serait une salle différente de la carte 8, salle 3.

+0

Oui, cela fonctionnerait. Cela est également logique car la hiérarchie des données correspond à la hiérarchie d'URL. Est-ce important qu'il existe une possibilité d'URL invalides - en ce sens que vous pourriez avoir un roomID qui n'appartient pas au mapID spécifié? Je suppose que l'on devrait obtenir la bonne carte où l'ID de pièce est fourni, indépendamment de ce qui est dans l'URL. –

+0

Brillant, merci Dennis. –

Questions connexes