tag route net for data asp all asp.net-mvc action overloading httpverbs

asp.net-mvc - route - tag helpers asp net core



¿Cómo puedo sobrecargar las acciones de ASP.NET MVC según los verbos HTTP aceptados? (4)

Quería usar la misma URL para GET / PUT / DELETE / POST para una API basada en REST, pero cuando lo único diferente de las Acciones es qué verbos HTTP acepta, ¡los considera duplicados!

"Tipo ya define un miembro llamado ''Índice'' con los mismos tipos de parámetros".

A lo que dije, ¿y qué? Este solo acepta GET, este solo acepta POST ... debería poder coexistir, ¿verdad?

¿Cómo?


Como solución alternativa, puede agregar a uno de los métodos un argumento adicional con un valor predeterminado, solo para evitar la limitación y poder construir.

Por supuesto, tenga en cuenta que esta no es la forma más recomendada de hacer las cosas, y también tendrá que dejar claro en su código (por el nombre del parámetro o por medio de comentarios) que este es un argumento adicional solo para permitir que se construya. y, por supuesto, asegúrese de haber decorado sus atributos correctamente.


Otra opción es tener un solo método que acepte todos y distinga entre HttpMethod y llame al código apropiado desde allí. P.ej

string httpMethod = Request.HttpMethod.ToUpperInvariant(); switch (httpMethod) { case "GET": return GetResponse(); case "POST": return PostResponse(); default: throw new ApplicationException(string.Format("Unsupported HttpMethod {0}.", httpMethod)); }


Si bien ASP.NET MVC le permitirá tener dos acciones con el mismo nombre, .NET no le permitirá tener dos métodos con la misma firma, es decir, el mismo nombre y los mismos parámetros.

Deberá nombrar los métodos de manera diferente, use el atributo ActionName para decirle a ASP.NET MVC que en realidad son la misma acción.

Dicho esto, si está hablando de un GET y un POST , es probable que este problema desaparezca, ya que la acción POST tendrá más parámetros que el GET y, por lo tanto, será distinguible.

Entonces, necesitas:

[HttpGet] public ActionResult ActionName() {...} [HttpPost, ActionName("ActionName")] public ActionResult ActionNamePost() {...}

O:

[HttpGet] public ActionResult ActionName() {...} [HttpPost] public ActionResult ActionName(string aParameter) {...}


Eso no es una limitación de ASP.NET MVC o lo que sea. Es .NET y cómo funcionan las clases: no importa cuánto lo intentes, no puedes tener dos métodos con el mismo nombre en la misma clase que toman los mismos parámetros. Podrías hacer trampa usando el atributo [ActionName] :

[HttpGet] [ActionName("Foo")] public ActionResult GetMe() { ... } [HttpPut] [ActionName("Foo")] public ActionResult PutMe() { ... } [HttpDelete] [ActionName("Foo")] public ActionResult DeleteMe() { ... } [HttpPost] [ActionName("Foo")] public ActionResult PostMe() { ... }

Por supuesto, en una aplicación RESTFul real, los diferentes verbos también tomarían diferentes parámetros, por lo que rara vez tendrá tales situaciones.

Puede echar un vistazo a SimplyRestful para obtener algunas ideas sobre cómo se podrían organizar sus rutas.