Puis-je avoir domain.com/action/id ainsi que domain.com/controller/action? Comment est-ce que je pourrais les enregistrer dans la table de route?asp.net mvc routing - est-ce possible?
Répondre
L'ID est-il toujours garanti être un nombre? Si oui, vous pouvez utiliser RouteConstraints:
routes.MapRoute("ActionIDRoute",
"{action}/{id}",
new { controller = "SomeController" },
new {id= new IDConstraint()});
routes.MapRoute("ControllerActionRoute",
"{controller}/{action}",
new {}); // not sure about this last line
La classe IDConstraint ressemble à ceci:
public class IDConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route,
string parameterName, RouteValueDictionary values,
RouteDirection routeDirection)
{
var value = values[parameterName] as string;
int ID;
return int.TryParse(value,out ID);
}
}
Fondamentalement, ce qui se passe est que vous avez deux voies identiques ici - deux paramètres, il est donc ambigous. Les contraintes d'itinéraire sont appliquées aux paramètres pour voir s'ils correspondent.
Alors:
- Vous appelez http://localhost/SomeController/SomeAction
- Il frappera le ActionIDRoute, comme cela a deux espaces réservés
- Comme il y a une contrainte sur le paramètre ID (uneAction), ASP.net MVC appeler la fonction match()
- Comme int.TryParse échoue sur uneAction, l'itinéraire est mis au rebut
- la route suivante qui correspond est le ControllerActionRoute
- Comme cela correspond et il n'y a pas de contraintes sur elle, cela sera pris
Si ID n'est pas garanti d'être un numéro, alors vous avez le problème à résoudre l'ambiguïté. La seule solution que je connaisse est le codage en dur des routes où {action}/{id} s'applique, ce qui n'est peut-être pas toujours possible.
Oui, vous pouvez ajouter une nouvelle règle au-dessus de la règle par défaut et fournir une valeur par défaut pour le contrôleur.
routes.MapRoute(
"MyRole", // Route name
"{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
L'exemple transmet toutes les actions au contrôleur "Home".
et quelle règle prendrait soin de la route domain.com/controller/action? J'ai AccountController qui possède une actionlog de LogOn définie. Toutefois, domain.com/account/logon n'est pas intercepté par le routetable. – TPR
La règle par défaut est. – AxelEckenberger
- 1. asp.net mvc routing
- 2. ASp.Net MVC routing
- 3. asp.net mvc url routing
- 4. ASP.Net MVC Routing Issue..Encore
- 5. asp.net mvc dynamic/relative routing
- 6. Asp.net MVC Routing Type de
- 7. ASP.NET MVC Routing Root Level Views
- 8. MVC Advanced Routing
- 9. MVC question Routing
- 10. MVC Custom Routing
- 11. MVC 2 Routing - {Contrôleur} .com/{action}/{id} - Est-ce possible?
- 12. des problèmes avec MVC Routing
- 13. ASP.NET MVC Routing, "bin" comme valeur de paramètre de route
- 14. ASP.NET MVC: Routing a besoin URL exacte pour travailler
- 15. Asp.Net MVC Routing - comment faire correspondre l'ensemble de l'URL?
- 16. MVC Routing - Nom des paramètres question
- 17. .Net MVC Routing Catchall ne fonctionne pas
- 18. Asp.Net MVC + CSLA + DDD possible
- 19. asp.net MVC et routage RESTful, style rails. C'est possible?
- 20. Webforms Routing ignore Elmah
- 21. Can .net mvc routing provoque des erreurs JavaScript?
- 22. CodeIgniter Routing
- 23. ASP.net MVC Routing: Est-il un bon style à utiliser QueryStrings?
- 24. Comment prendre en charge les URL de leagcy (type de formulaires Web) dans asp.net mvc routing
- 25. can asp.net routing 3.5 sp1 faire ce problème?
- 26. itinéraires récursifs dans asp.net mvc
- 27. Zendframework Routing Issue
- 28. Rails 3 routing
- 29. WPF event routing
- 30. CakePHP Routing assistance
Eh bien, id est garanti pour être un nombre pour le moment, mais qui sait quand le projet se développe, si vous savez ce que je veux dire. – TPR
@progtick En effet, mais cela pourrait devenir un problème. Comme dit, votre problème est que vous avez deux routes égales, c'est-à-dire: 2 routes qui ont la même apparence car elles ont le même format et le même nombre d'espaces réservés. Le nom des Placeholders n'a pas d'importance, mais vous devez d'une manière ou d'une autre les différencier. RouteConstraints est un moyen si vous savez que la sémantique est toujours différente (l'ID est toujours un nombre et Action n'est jamais un nombre, ou l'ID commence toujours par i_ et l'action ne commence jamais par i_). L'autre option: Modifiez complètement votre itinéraire pour ne pas avoir d'itinéraires similaires. –
Je suis d'accord. Je vais réfléchir à cela. En attendant, votre solution d'utilisation de contraintes fonctionne pour moi. – TPR