c# - route - select asp-for asp-items
La POST del formulario de ASP.NET Core da como resultado una respuesta de tipo de medio no compatible con HTTP 415 (5)
El envío de una solicitud HTTP POST de formulario (
Content-Type: application/x-www-form-urlencoded
) al controlador a continuación da como resultado una respuesta de
tipo de medio HTTP 415 no compatible
.
public class MyController : Controller
{
[HttpPost]
public async Task<IActionResult> Submit([FromBody] MyModel model)
{
//...
}
}
Encabezados HTTP de publicación de formulario:
POST /submit HTTP/1.1
Host: example.com:1337
Connection: keep-alive
Content-Length: 219
Pragma: no-cache
Cache-Control: no-cache
Origin: https://example.com:1337
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: https://example.com:1337/submit
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8,nl;q=0.6
Esto solía funcionar con ASP.NET MVC 5 en .NET 4.6.
Además de buenas respuestas, no tiene que usar
[FromForm]
para obtener los datos del formulario en el controlador.
Framework convierte automáticamente los datos del formulario al modelo que desee.
Puede implementar como sigue.
[HttpPost]
public async Task<IActionResult> Submit(MyModel model)
{
//...
}
Este es mi caso: se ejecuta Entorno: Controlador AspNet Core 2.1:
public class MyController
{
// ...
[HttpPost]
public ViewResult Search([FromForm]MySearchModel searchModel)
{
// ...
return View("Index", viewmodel);
}
}
Ver:
<form method="post" asp-controller="MyController" asp-action="Search">
<input name="MySearchModelProperty" id="MySearchModelProperty" />
<input type="submit" value="Search" />
</form>
Para los formularios, use el atributo
[FromForm]
lugar del atributo
[FromBody]
.
El siguiente controlador funciona con ASP.NET Core 1.1:
public class MyController : Controller
{
[HttpPost]
public async Task<IActionResult> Submit([FromForm] MyModel model)
{
//...
}
}
Primero debe especificar en los encabezados el tipo de
Content-Type
, por ejemplo, puede ser
application/json
.
Si configura el tipo de contenido de la
application/json
, debe enviar un json.
Entonces, en el
body
de su solicitud, no enviará
form-data
, no
x-www-for-urlencoded
sino un json
raw
formato, por ejemplo
{"Username": "user", "Password": "pass"}
Puede adaptar el ejemplo a varios tipos de contenido, incluido lo que desea enviar.
Puedes usar una herramienta como Postman o curl para jugar con esto.
Puede usar
[FromBody]
pero necesita configurar el encabezado
Content-Type
de su solicitud en
application/json
, es decir
Content-Type: application/json