Utilizando los localizadores de métodos listos para usar en ASP.NET MVC (3 o 4DP), ¿hay alguna manera de que el marco MVC diferencie entre una cadena y Guid sin necesidad para analizar el parámetro en la acción del controlador?Diferenciar Guid y parámetros de cadena en MVC 3
Ejemplos de uso serían para la dirección URL
http://[domain]/customer/details/F325A917-04F4-4562-B104-AF193C41FA78
para ejecutar el método
public ActionResult Details(Guid guid)
y
para ejecutar el
public ActionResult Details(string id)
método.
Sin cambios, obviamente, los métodos son ambiguos, de la siguiente manera:
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);
}
que produce el error:
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
he tratado de usar una limitación personalizado (basado en How can I create a route constraint of type System.Guid?) para tratar y empujarlo a través de enrutamiento:
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 }
);
Y cambió el firmas de acción a:
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 restricción se ejecuta y se pasa, por tanto, el argumento se envía a una acción, pero al parecer todavía como una cadena, y por lo tanto ambiguo a las dos firmas de métodos. Espero que haya algo en cómo se ubican los métodos de acción que causa la ambigüedad y, por lo tanto, se puede anular al conectar un módulo personalizado para buscar métodos.
Se podría obtener el mismo resultado analizando el parámetro de cadena, pero sería muy agradable por brevedad para evitar esa lógica en la acción (sin mencionar que con suerte volverá a usarse algún día más tarde).
tienes razón, el localizador método de acción es ajeno a la restricción de ruta. Si elimina el método de acción de cadena, ¿se elige el método de acción guid? – bzlm
MVC no admite la sobrecarga de métodos basada exclusivamente en la firma: la solución más fácil para usted sería simplemente tener dos métodos de acción con nombre único, uno para detalles por GUID (Detalles) y otro para obtener detalles por nombre (Búsqueda o Información tal vez ?). – Tommy
@bzlm - Correcto, al eliminar la acción de cadena seleccionará el Guid (suponiendo que pase la restricción O se puede analizar en un Guid). – falquan