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

http://[domaine]/client/détails/bill-gates

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).

Vous avez raison, la méthode de l'action locator est inconscient de la voie de contrainte. Si vous supprimez la chaîne de la méthode d'action, ne le guid de la méthode d'action choisi?
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