2010-06-14 8 views
0

Je crée une application ASP.NET MVC modulaire à l'aide de zones. En bref, j'ai créé une route gourmande qui capture toutes les routes commençant par {application}/{* catchAll}.URL de chaîne de mappage ASP.NET MVC vers un objet de valeur de routage

Voici l'action:

// get /application/index 
public ActionResult Index(string application, object catchAll) 
{ 
    // forward to partial request to return partial view 
    ViewData["partialRequest"] = new PartialRequest(catchAll); 

    // this gets called in the view page and uses a partial request class to return a partial view 
} 

Exemple:

L'URL "/ Application/comptes/logon" fera alors l'action Index de passer "/ Comptes/logon" dans le PartialRequest, mais comme une valeur de chaîne.

// partial request constructor 
public PartialRequest(object routeValues) 
{ 
    RouteValueDictionary = new RouteValueDictionary(routeValues); 
} 

Dans ce cas, le dictionnaire de la valeur d'itinéraire ne renvoyaient pas de valeur pour le RouteData, alors que si je spécifie une route dans l'action Index:

ViewData["partialRequest"] = new PartialRequest(new { controller = "accounts", action = "logon" }); 

Il fonctionne, et les valeurs RouteData contient une touche "contrôleur" et une touche "action"; alors qu'avant, les clés sont vides, et donc le reste de la classe ne fonctionnera pas. Donc, ma question est, comment puis-je convertir le "/ Accounts/LogOn" dans le catchAll à "new {controller =" comptes ", action =" logon "}" ??

Si ce n'est pas clair, je vais vous expliquer plus! :)

Matt

C'est le « plus proche » J'ai eu, mais il travail évidemment coutume pour les itinéraires complexes:

// split values into array 
var routeParts = catchAll.ToString().Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); 

// feels like a hack 
catchAll = new 
{ 
    controller = routeParts[0], 
    action = routeParts[1] 
}; 

Répondre

0

Vous devez savoir quelle partie est ce que dans le paramètre Catchall. Ensuite, vous devez l'analyser vous-même (comme vous le faites dans votre exemple ou utiliser une expression rationnelle). Il n'y a aucun moyen pour l'infrastructure de savoir quelle partie est le nom du contrôleur et quel est le nom de l'action et ainsi de suite, car vous ne l'avez pas spécifié dans votre itinéraire.

Pourquoi voulez-vous faire quelque chose comme ça? Il y a probablement un meilleur moyen.

+0

Cela a du sens, merci! Les zones de l'application MVC renvoient des vues partielles (je peux donc avoir plusieurs vues partielles sur une page). Il s'agit d'un problème lors de la liaison directe à la vue partielle (par exemple, Comptes/LogOn, qui renvoie une vue partielle appelée LogOn). Il retournera la vue partielle elle-même, et non une vue qui contient le reste de la page html. C'est pourquoi j'ai voulu créer une route gourmande qui force l'application à retourner une vue avec les requêtes partielles à l'intérieur. Des idées? – mwgriffiths

+0

@mwgriffiths, d'accord, je vois. Je suppose que vous voulez dire que vous utilisez Html.RenderAction (...) et que vous souhaitez afficher des vues différentes selon que l'URL est appelée depuis cette méthode ou directement depuis le navigateur? Je peux voir les avantages de cela. Cependant, je les divise généralement en deux actions, une pour l'utiliser quand j'appelle Html.RenderAction() et une autre pour quand vous voulez juste voir la page. –

+0

@Mattias Jakobsson; Un peu comme vous l'avez décrit, oui! pouvez-vous expliquer un peu plus sur le dernier point cependant? à propos des deux actions? Je pourrais manquer le sens! Je ne me considère pas comme un novice en MVC, je pensais qu'une page maître fortement typée était mauvaise (ça prenait 3 jours!), Mais ça m'a bloqué! – mwgriffiths

Questions connexes