322 votos

¿Usted puede sobrecargar métodos de controlador en ASP.Net MVC?

Im curiosidad por ver si usted puede sobrecargar métodos de controlador en ASP.Net MVC. Cada vez que lo intente, me da el error siguiente. Los dos métodos aceptan argumentos diferentes. ¿Esto es algo que no se puede hacer?

La solicitud para la acción 'MiMetodo' en el tipo de controlador actual 'MyController' es ambiguo entre los siguientes métodos de acción:

199voto

JD Conley Puntos 1848

Usted puede utilizar el atributo si desea que su código para hacer la sobrecarga.

[ActionName("MyOverloadedName")]

Pero, tendrás que usar otro nombre de la acción por el mismo método http (como otros han dicho). Así que es sólo semántica en ese punto. ¿Te gustaría tener el nombre en su código o su atributo?

Phil tiene un artículo relacionado con este: http://haacked.com/archive/2008/08/29/how-a-method-becomes-an-action.aspx

69voto

tvanfosson Puntos 268301

Sí. He sido capaz de hacer esto mediante el establecimiento de la HttpGet/HttpPost (o equivalente AcceptVerbs de atributo) para cada método de controlador para algo distinto, es decir, HttpGet o HttpPost, pero no tanto. De esa manera se puede decir con base en el tipo de petición que el método a utilizar.

[HttpGet]
public ActionResult Show()
{
   ...
}

[HttpPost]
public ActionResult Show( string userName )
{
   ...
}

Una sugerencia que tengo es que, para un caso como este, sería tener una aplicación privada que tanto de su Acción pública métodos se basan en evitar la duplicación de código.

41voto

Farrel Puntos 231

Aquí hay algo más podrías hacer... quieres un método que es capaz de tener un parámetro y no.

¿Por qué no probar esto...

public ActionResult Show( string username = null )
{
   ...
}

Esto ha funcionado para mí... y en este único método, en realidad puede probar para ver si tiene el parámetro de entrada.


Actualizado para quitar la sintaxis no válida que acepta valores NULL en cadena y utilizar un valor de parámetro predeterminado.

15voto

Ian Mercer Puntos 19271

Para superar este problema podrás escribir un ActionMethodSelectorAttribute que examina el MethodInfo para cada acción y compara a la forma publicada valora y luego rechaza cualquier método para que los valores del formulario no coinciden (excluyendo el nombre del botón, por supuesto).

Aquí está un ejemplo:- http://blog.abodit.com/2010/02/asp-net-mvc-ambiguous-match/

Pero, esto no es una buena idea.

14voto

keeney Puntos 434

En cuanto yo sé que sólo puede tener el mismo método http diferentes métodos.

es decir

[AcceptVerbs("GET")]
public ActionResult MyAction()
{

}

[AcceptVerbs("POST")]
public ActionResult MyAction(FormResult fm)
{

}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X