ASP.NET核心FromForm和FromBody相同的行动

Pet*_*sev 13 asp.net-mvc asp.net-core

我可以同时使用FromForm和FromBody属性吗?

public IActionResult Index([FromBody][FromForm] Person model){
.....
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*und 23

不,这是不可能的.

FromForm属性用于来自内容类型发送的提交表单的传入数据,application/x-www-url-formencodedFromBody将以默认方式解析模型,在大多数情况下application/json,由请求正文通过内容类型发送.

  • @kloarubeek是的,它可能在不同的操作上,而不是在相同的操作上。 (2认同)

小智 7

请查看这个库 https://github.com/shamork/Toycloud.AspNetCore.Mvc.ModelBinding.BodyAndFormBinding

我使用了源代码并进行了一些修改,因为 .Net 5 存在问题,ComplexTypeModelBinderProvider 已过时

https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.modelbinding.binders.complextypemodelbinderprovider?view=aspnetcore-5.0

简而言之,这可以防止必须这样做

    public class JsonRequestItem {
        public string jsonRequest { get; set; }
    }

    [HttpPost]
    [ActionName("NewRequest")]
    [Consumes("application/json")]
    public IActionResult NewRequestFromBody([FromBody]JsonRequestItem item) {
        return NewRequest(item.jsonRequest);
    }

    [HttpPost]
    [ActionName("NewRequest")]
    [Consumes("application/x-www-form-urlencoded")]
    public IActionResult NewRequestFromForm([FromForm]JsonRequestItem item) {
        return NewRequest(item.jsonRequest);
    }

    private IActionResult NewRequest(string jsonRequest) {
        return new EmptyResult(); // example
    }
Run Code Online (Sandbox Code Playgroud)

现在您可以简化为一个操作并同时获取 FromBody 和 FromForm

    [HttpPost]
    [ActionName("NewRequest")]
    public IActionResult NewRequestFromBodyOrDefault([FromBodyOrDefault]JsonRequestItem item) {
        return new EmptyResult(); // example
    }
Run Code Online (Sandbox Code Playgroud)