Utilizzando i locator di metodo predefiniti in ASP.NET MVC (3 o 4DP), esiste un modo per differenziare la struttura MVC da una stringa a Guid senza richiedere analizzare il parametro nell'azione del controller?Differenzia guida e parametri stringa in MVC 3
Esempi di utilizzo sarebbero per l'URL
http://[domain]/customer/details/F325A917-04F4-4562-B104-AF193C41FA78
per eseguire il metodo
public ActionResult Details(Guid guid)
e
per eseguire il
public ActionResult Details(string id)
metodo
.
senza modifiche, ovviamente, i metodi sono ambigue, come segue:
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);
}
causando l'errore:
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
ho cercato di utilizzare un vincolo personalizzato (in base a How can I create a route constraint of type System.Guid?) per provare e inviarlo tramite instradamento:
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 }
);
E acceso firme azione al:
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);
}
Il vincolo esegue e passa, quindi l'argomento viene inviato ad un'azione, ma apparentemente ancora come una stringa, e quindi ambiguo ai due firme dei metodi. Mi aspetto che ci sia qualcosa nel modo in cui sono posizionati i metodi di azione che causa l'ambiguità, e quindi potrebbe essere sovrascritto collegando un modulo personalizzato per individuare i metodi.
Lo stesso risultato potrebbe essere ottenuto analizzando il parametro stringa, ma sarebbe davvero bello per brevità evitare quella logica nell'azione (per non parlare di riutilizzare, eventualmente, un giorno più tardi).
Hai ragione, il metodo di azione Locator è ignaro del vincolo percorso. Se rimuovi il metodo di azione della stringa, viene scelto il metodo di guida? – bzlm
MVC non supporta l'overloading dei metodi basato esclusivamente sulla firma: la soluzione più semplice per voi sarebbe probabilmente quella di avere due metodi di azione denominati in modo univoco, uno per i dettagli tramite GUID (Dettagli) e un altro per ottenere i dettagli per nome (Ricerca o Informazioni forse ?). – Tommy
@bzlm - Correggere, rimuovendo l'azione della stringa si seleziona il Guid (supponendo che passi il vincolo OR possa essere analizzato in un Guid). – falquan