tutorial net mvc español ejemplo curso create asp c# asp.net-mvc

c# - net - Enrutamiento: la solicitud actual de acción[...] es ambigua entre los siguientes métodos de acción



mvc c# (3)

Tengo una Vista llamada Browse.chtml , donde el usuario puede ingresar un término de búsqueda o dejar el término de búsqueda en blanco. Al ingresar el término de búsqueda, deseo dirigir la página a http://localhost:62019/Gallery/Browse/{Searchterm} y cuando no se ingresa nada, deseo dirigir el navegador a http://localhost:62019/Gallery/Browse/Start/Here .

Cuando intento esto, obtengo el error:

La solicitud actual de acción ''Examinar'' en el tipo de controlador ''GalleryController'' es ambigua entre los siguientes métodos de acción: System.Web.Mvc.ActionResult Browse (System.String) en el tipo AutoApp_MVC.Controllers.GalleryController System.Web.Mvc.ActionResult Browse (Int32, System.String) en tipo AutoApp_MVC.Controllers.GalleryController

Todo lo que estoy haciendo con MVC es por primera vez. No estoy seguro de qué más probar en este momento.

public ActionResult Browse(string id) { var summaries = /* search using id as search term */ return View(summaries); } public ActionResult Browse(string name1, string name2) { var summaries = /* default list when nothing entered */ return View(summaries); }

También tengo esto en Global.asax.cs:

routes.MapRoute( "StartBrowse", "Gallery/Browse/{s1}/{s2}", new { controller = "Gallery", action = "Browse", s1 = UrlParameter.Optional, s2 = UrlParameter.Optional }); routes.MapRoute( "ActualBrowse", "Gallery/Browse/{searchterm}", new { controller = "Gallery", action = "Browse", searchterm=UrlParameter.Optional });


Creo que el punto que se trata es que no es necesario probar implícitamente los parámetros querystring utilizando la clase de solicitud.

MVC hace el mapeo por usted (a menos que haya realizado cambios severos en sus rutas MVC).

Por lo tanto, una ruta de enlace de acción de

/umbraco/Surface/LoginSurface/Logout?DestinationUrl=/home/

estaría automáticamente disponible para su controlador (de superficie) con el parámetro definido:

public ActionResult Logout(string DestinationUrl)

MVC hace el trabajo.


No sé cuándo se formuló la pregunta, esta solución estaba disponible, pero puede usar:

Request.QueryString["key"]

Así que esto debería funcionar bien para su problema:

[HttpGet] public ActionResult Browse() { if( Request.QueryString["id"] != null ) var summaries = /* search using id as search term */ else /*assuming you don''t have any more option*/ var summaries = /* default list when nothing entered */ return View(summaries); }


Solo puede tener un máximo de 2 métodos de acción con el mismo nombre en un controlador, y para hacerlo, 1 debe ser [HttpPost] y el otro debe ser [HttpGet] .

Como ambos métodos son GET, debe cambiar el nombre de uno de los métodos de acción o moverlo a un controlador diferente.

Aunque sus 2 métodos de búsqueda son sobrecargas C # válidas, el selector de método de acción MVC no puede determinar qué método invocar. Intentará hacer coincidir una ruta con el método (o viceversa), y este algoritmo no está fuertemente tipado.

Puede lograr lo que quiera utilizando rutas personalizadas que apunten a diferentes métodos de acción:

... en Global.asax

routes.MapRoute( // this route must be declared first, before the one below it "StartBrowse", "Gallery/Browse/Start/Here", new { controller = "Gallery", action = "StartBrowse", }); routes.MapRoute( "ActualBrowse", "Gallery/Browse/{searchterm}", new { controller = "Gallery", action = "Browse", searchterm = UrlParameter.Optional });

... y en el controlador ...

public ActionResult Browse(string id) { var summaries = /* search using id as search term */ return View(summaries); } public ActionResult StartBrowse() { var summaries = /* default list when nothing entered */ return View(summaries); }

También es posible que pueda mantener los métodos de acción nombrados de la misma manera en el controlador , aplicando un atributo [ActionName] a uno para distinguirlo. Usando el mismo Global.asax como el anterior, su controlador se vería así:

public ActionResult Browse(string id) { var summaries = /* search using id as search term */ return View(summaries); } [ActionName("StartBrowse")] public ActionResult Browse() { var summaries = /* default list when nothing entered */ return View(summaries); }