¿Puedes sobrecargar los métodos del controlador en ASP.NET MVC?

Resuelto Papa Burgundy asked hace 15 años • 18 respuestas

Tengo curiosidad por ver si puedes sobrecargar los métodos del controlador en ASP.NET MVC. Cada vez que lo intento, aparece el siguiente error. Los dos métodos aceptan argumentos diferentes. ¿Es esto algo que no se puede hacer?

La solicitud actual de acción 'MyMethod' en el tipo de controlador 'MyController' es ambigua entre los siguientes métodos de acción:

Papa Burgundy avatar Jan 13 '09 03:01 Papa Burgundy
Aceptado

Puede utilizar el atributo si desea que su código se sobrecargue.

[ActionName("MyOverloadedName")]

Pero tendrás que usar un nombre de acción diferente para el mismo método http (como han dicho otros). Así que en ese momento es sólo semántica. ¿Preferirías tener el nombre en tu código o en tu atributo?

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

JD Conley avatar Jan 12 '2009 20:01 JD Conley

Sí. Pude hacer esto configurando HttpGet/ HttpPost(o AcceptVerbsatributo equivalente) para cada método de controlador en algo distinto, es decir, HttpGeto HttpPost, pero no ambos. De esa manera, puede saber, según el tipo de solicitud, qué método 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 implementación privada en la que se basen ambos métodos de acción públicos para evitar la duplicación de código.

tvanfosson avatar Jan 12 '2009 20:01 tvanfosson

Aquí hay algo más que podrías hacer... quieres un método que pueda 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 método, puedes probar para ver si tienes el parámetro entrante.


Actualizado para eliminar la sintaxis anulable no válida en la cadena y utilizar un valor de parámetro predeterminado.

Farrel avatar Mar 29 '2011 06:03 Farrel

No, No y No. Vaya y pruebe el código del controlador a continuación donde tenemos el "LoadCustomer" sobrecargado.

public class CustomerController : Controller
    {
        //
        // GET: /Customer/

        public ActionResult LoadCustomer()
        {
            return Content("LoadCustomer");
        }
        public ActionResult LoadCustomer(string str)
        {
            return Content("LoadCustomer with a string");
        }
    }

Si intenta invocar la acción "CargarCliente", obtendrá el error como se muestra en la siguiente figura.

ingrese la descripción de la imagen aquí

El polimorfismo es parte de la programación de C#, mientras que HTTP es un protocolo. HTTP no entiende el polimorfismo. HTTP funciona en la URL del concepto y la URL solo puede tener nombres únicos. Entonces HTTP no implementa polimorfismo.

Para solucionar el mismo, necesitamos usar el atributo "ActionName".

public class CustomerController : Controller
    {
        //
        // GET: /Customer/

        public ActionResult LoadCustomer()
        {
            return Content("LoadCustomer");
        }

        [ActionName("LoadCustomerbyName")]
        public ActionResult LoadCustomer(string str)
        {
            return Content("LoadCustomer with a string");
        }
    }

Entonces, si realiza una llamada a la URL "Cliente/CargarCliente", se invocará la acción "CargarCliente" y con la estructura de URL "Cliente/CargarClientePorNombre", se invocará "CargarCliente(cadena de cadena)".

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

La respuesta anterior la tomé de este artículo del proyecto de código --> Sobrecarga de acción MVC

Shivprasad Koirala avatar Nov 27 '2014 23:11 Shivprasad Koirala