Différencier les Guid et des Paramètres de chaîne dans MVC 3
À l'aide de l'out-of-the-box méthode localisateurs dans ASP.NET MVC (3 ou 4DP), est-il un moyen d'avoir le framework MVC différencier entre une chaîne et Guid sans avoir à analyser le paramètre dans le contrôleur de l'action?
Exemples d'utilisation serait pour l'URL
http://[domaine]/client/détails/F325A917-04F4-4562-B104-AF193C41FA78
pour exécuter la
public ActionResult Details(Guid guid)
méthode, et
pour exécuter la
public ActionResult Details(string id)
méthode.
Avec pas de changements, de toute évidence, les méthodes sont ambigus, comme suit:
public ActionResult Details(Guid id)
{
var model = Context.GetData(id);
return View(model);
}
public ActionResult Details(string id)
{
var model = Context.GetData(id);
return View(model);
}
ce qui entraîne l'erreur:
The current request for action 'Details' on controller type 'DataController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Details(System.Guid) on type Example.Web.Controllers.DataController
System.Web.Mvc.ActionResult Details(System.String) on type Example.Web.Controllers.DataController
J'ai tenté d'utiliser un custom contrainte (basé sur Comment puis-je créer un itinéraire de contrainte de type System.Guid?) pour essayer de le pousser à travers par l'intermédiaire de routage:
routes.MapRoute(
"Guid",
"{controller}/{action}/{guid}",
new { controller = "Home", action = "Index" },
new { guid = new GuidConstraint() }
);
routes.MapRoute(
"Default", //Route name
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Et sont passés à l'action des signatures:
public ActionResult Details(Guid guid)
{
var model = Context.GetData(guid);
return View(model);
}
public ActionResult Details(string id)
{
var model = Context.GetData(id);
return View(model);
}
La contrainte s'exécute et passe, ainsi, l'argument est envoyé à une action, mais apparemment toujours comme une chaîne de caractères, et donc ambigu pour les deux signatures de méthode. Je suppose qu'il y a quelque chose dans la façon dont les méthodes d'action sont situées qui provoque l'ambiguïté, et pourrait donc être remplacée par de brancher un module personnalisé pour localiser méthodes.
Le même résultat pourrait être obtenu par l'analyse de la chaîne de paramètre, mais ce serait vraiment bien pour des raisons de concision pour éviter que la logique de l'action (pour ne pas mentionner l'espoir de les réutiliser un jour plus tard).
MVC ne supporte pas la surcharge de la méthode basée uniquement sur la signature - la solution la plus simple pour vous serait probablement tout simplement deux uniquement le nom de méthodes d'action, l'un pour les détails par GUID (Détails) et un autre pour obtenir des informations par (nom de la Recherche ou de l'Information peut-être?).
Correct, le retrait de la chaîne action sélectionnez le Guid (en supposant qu'il passe à la contrainte OU peut être analysé dans un Guid).
OriginalL'auteur falquan | 2011-09-27
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous devez disambigute vos méthodes en leur donnant deux noms différents:
Ensuite, vous avez besoin d'un itinéraire personnalisé gestionnaire d'inspecter la demande, et de changer le nom de la méthode en conséquence:
Enfin, ajouter une
Details
route au-dessus de vos voies, comme suit:Lorsqu'une demande arrive pour les détails, les
Details
itinéraire utiliser votre itinéraire personnalisé gestionnaire d'inspecter leid
jeton. Le gestionnaire d'itinéraire ajoute le nom de l'action basée sur la forme de l'id de jeton, de sorte que la demande doit être acheminée à l'action appropriée.OriginalL'auteur counsellorben
Mon avis est que l'utilisation de la méthode d'action sélecteur est plus utilisable et moins de codage.
Ce sélecteur inspecte demande d'ID de paramètre. Si c'est guid, il renvoie la valeur true. Donc, pour l'utiliser:
OriginalL'auteur Nickmaovich
Si vous êtes en train d'enregistrer des itinéraires de cette façon, alors le GuidRouteConstraint() de la classe a été ajouté dans une version plus récente de la MVC et doit être utilisé au lieu d'une implémentation personnalisée:
Ensuite, vous pouvez tout simplement créer votre action résultat:
using
de l'instruction, vous voudrez probablementusing System.Web.Mvc.Routing.Constraints;
et non du Système.Web.Http.Le routage.Les contraintesOriginalL'auteur Laurence C