ASP.net MVC de routage avec en option le premier paramètre
J'ai besoin de fournir des fonctionnalités suivantes pour l'un de ces sites web.
http://www.example.com/[sponsor]/{controller}/{action}
Selon le [sponsor], la page web doit être personnalisé.
J'ai essayé la combinaison d'inscrire les itinéraires avec Application_Start et Session_Start, mais pas en mesure de le faire fonctionner.
public static void RegisterRoutes(RouteCollection routes, string sponsor)
{
if (routes[sponsor] == null)
{
routes.MapRoute(
sponsor, //Route name
sponsor + "/{controller}/{action}/{id}", //URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } //Parameter defaults
);
}
}
Aussi, le comportement par défaut sans [sponsor] devrait également fonctionner.
Quelqu'un peut s'il vous plaît laissez-moi savoir si il est techniquement possible d'avoir une option de premier paramètre de la MVC3 URL. Si oui, veuillez nous faire part de la mise en œuvre. Merci.
Mise À Jour Du Code
Après avoir fait les modifications suggérées par Sergey Kudriavtsev, le code fonctionne que lorsque la valeur est donnée.
Si aucun nom n'est fourni, MVC ne pas passer à l'action de contrôleur.
Notez que cela ne fonctionne que pour le contrôleur de la maison (à la fois et non-sponsor). Pour d'autres contrôleurs/actions, même si le commanditaire paramètre est spécifié, il n'est pas de routage.
Veuillez indiquer ce qui doit être modifié.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"SponsorRoute",
"{sponsor}/{controller}/{action}/{id}", //URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
"NonSponsorRoute",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional, sponsor = string.Empty }
);
}
Méthode D'Action
public ActionResult Index(string sponsor)
{
}
OriginalL'auteur Sandeep G B | 2011-11-29
Vous devez vous connecter pour publier un commentaire.
Dans votre cas
sponsor
ne doit pas être considérée comme une constante de la partie de l'URL, mais comme une partie variable.Mondiale.asax:
Dans vos contrôleurs, par exemple, HomeController.cs:
Noter que le type de ce paramètre sera toujours
System.String
et le nom de la route de modèle de composant{sponsor}
doit correspondre exactement au nom de paramètre actionstring sponsor
dans vos contrôleurs.UPD: Ajout d'une deuxième voie pour les non-sponsor cas.
Veuillez noter que le programme d'installation va compliquer votre logique, parce que vous pourriez confondre les différentes url, URL
http://www.example.com/a/b/c
pourrait être compensée par deux voies: d'abord on aura commanditaire=a, controller=b et action=c; la deuxième, on aura controller=a, action=b et id=c.
Cette situation peut être évitée si vous spécifiez plus strictes exigences en Url - par exemple, vous souhaitez peut-être les identifications soient numériques uniquement. Les Restrictions sont précisées dans le quatrième paramètre de
routes.MapRoute()
fonction.Une autre approche pour la désambiguïsation est de spécifier différents itinéraires pour tous vos contrôleurs (en général, vous n'aurez pas beaucoup d'entre eux dans votre application) avant le générique de la route pour les sponsors.
UPD:
Plus simple mais moins facile à gérer pour distinguer entre le commanditaire et non-sponsor routes est de spécifier un contrôleur de routes spécifiques, comme ceci:
Notez qu'ici, tous les spécifique de contrôleur des routes doit être ajouté avant SponsorRoute.
Plus complexe mais aussi plus propre est la mise en œuvre de RouteConstraints pour le parrain et le contrôleur des noms comme décrit dans la réponse de @counsellorben.
Ensuite, vous aurez besoin de deux routes: l'une avec {commanditaire}, un autre sans elle, je vais modifier ma réponse un peu...
Réponse de mise à jour.
Sergey, j'ai mis à jour ma question. Pouvez-vous s'il vous plaît aider.
Combien de contrôleurs avez-vous? Pouvez-vous donner la liste de leurs noms?
OriginalL'auteur Sergey Kudriavtsev
Dans mon cas, j'ai résolu ce problème en utilisant les deux routeurs:
Où
CultureConstraint
classe ressemble à ci-dessous:Et
MultiCultureMvcRouteHandler
comme ceci:CultureFactory.All
renvoie une liste de la culture des codes comme "de", "fr", "pl", etc., Je suppose que?!OriginalL'auteur Oleg Burov
En plus de l'ajout d'une seconde voie, avant que la route par défaut, Sergey a dit dans sa réponse, vous devez également ajouter un
RouteConstraint
à l'itinéraire initial, pour faire valoir ce que de la{sponsor}
jeton est le nom d'un titre de commanditaire.Vous pouvez utiliser le RouteConstraint dans cette réponse: Asp.Net Routage Personnalisé et personnalisé de routage et d'ajouter une catégorie avant de contrôleur
N'oubliez pas que vous devez également appliquer une règle à un commanditaire nom ne peut pas être le même que l'un de vos noms de contrôleur.
OriginalL'auteur counsellorben
je vais vous montrer en exemple simple, vous n'avez pas à changer dans Route.config.cs
seulement vous avez à faire dans Route.config.cs il suffit de mettre dans
Facultatif URI Paramètres et Valeurs par Défaut
Route.config.cs
Contrôleur
Résultats
localhost:2345/Nom/controllername/actionname/id(optionnel)
OriginalL'auteur saurav singh