2009-12-28 3 views
1

J'ai une fonction virtuelle appelée handlePathChange() dans ma classe Controller.
Il vérifie l'URL actuelle et devrait distribuer la bonne vue pour cela.
Voici le code que j'ai jusqu'à présent:Comment indiquer au contrôleur quelle vue appeler?

void Controller::handlePathChange() 
{ 
    if (app->internalPathMatches(basePath)) 
    { 
     string path = app->internalPathNextPart(basePath); 

     if (path.empty()) // If it's empty it is known that the index of the controller should show up 
      index(); 
     // else if (path == ??) each controller has it's own routes 
     // call_some_unknown_function(); 
    } 
} 

Comment puis-je généraliser cela?
Je pensais à deux options:

  1. Appel d'une fonction virtuelle pure appelée dispatch() qui correspondra le droit chemin à la fonction droite dans la classe dérivée. Cette solution viole DRY car vous écrivez le même code encore et encore.
  2. Créez une mappe de hachage de std :: function mais si une partie de l'URL est un paramètre, la vue ne sera pas trouvée. Donc, cette option n'est pas assez bonne.

Des idées?

Répondre

1

Je réalise votre message utilise un C++ par exemple, mais si cela ne vous dérange pas lire certains C#, cet article par Scott Guthrie est un aperçu de la façon dont le framework ASP.NET MVC met en œuvre son acheminement:

http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx

Je pense que vous trouverez cet article très utile. Dans un tri très simplifié, il est similaire à votre option n ° 2, mais il vérifie toujours un paramètre pour. Si le paramètre n'est pas fourni, il utilise la même règle de routage, mais fournit une valeur "par défaut" et envoie la demande à la vue correcte. Cette stratégie évite le problème que vous évoquez lorsque vous ne pouvez pas trouver la vue appropriée si le paramètre est spécifié.

Espérons que cela aide.

+1

Il y a un problème ici car C++ manque de réflexion. Je ne peux pas appeler index() hors de la chaîne "index". De plus, je ne peux pas avoir un conteneur hétérogène qui contient des objets de fonction qui n'ont pas la même longueur de paramètres? –

+0

Ah, je vois. Vous ne savez pas comment gérer l'invocation dynamique autre que ce que vous proposez dans # 1 et # 2. Cependant, avec les paramètres, ne pourriez-vous pas supposer le même nombre de paramètres et juste fournir des valeurs par défaut? Par exemple, - analyser l'URL - identifier l'action prévue en tant que première/mi-partie de l'URL - attribuer des paramètres supplémentaires si elle est fournie - sinon, envoyer les valeurs par défaut pour les valeurs de paramètre? On dirait que l'utilisation de cette option pourrait fonctionner avec votre option # 2? –

+0

J'ai commencé à l'écrire. A partir de maintenant j'utilise une table de hachage de paramètres (key: string, value: string), ce que je veux dire, c'est que s'ils ne correspondent pas à un contrôleur ou à une action, ils sont ajoutés aux paramètres. Maintenant, j'applique les valeurs par défaut. Comment implémenteriez-vous setView comme dans ASP.Net MVC? –

Questions connexes