【问题标题】:FormDataCollection not working in ASP.NET Core 2.1?FormDataCollection 在 ASP.NET Core 2.1 中不起作用?
【发布时间】:2018-12-20 17:55:57
【问题描述】:

不要在 Core 1.1 或 2.0 中检查它。 情况是使用 FormDataCollection 作为控制器方法中的参数,如下所示:

[Route("[controller]")]
[ApiController]
public class AuthController : ControllerBase
{
    [Route("user")]
    [HttpPost]
    public HttpResponseMessage CheckUser(FormDataCollection form)
    {
     ...
    }
}

无论 Content-Type 标头如何,它都会返回 400 Bad Request。

但它适用于 .NET Framework 4.5:

[RoutePrefix("auth")]
public class AuthController : ApiController
{
    [Route("user")]
    [HttpPost]
    public HttpResponseMessage user(FormDataCollection form)
    {
        ...
    }
}

我当然可以使用Request.Form.TryGetValue(key, out var value)。但是类 FormDataCollection 在 Core 中没有被贬低,我很好奇我们可以(并且应该)使用它来获取发布参数吗?

【问题讨论】:

  • 它曾经有用吗?操作接受 DTO 或显式参数。使用 FormDataCollection 之类的存储桶违背了 MVC 数据绑定的目的
  • 你为什么要使用FormDataCollection?如果您使用 DTO,它将从正文中实例化。如果你想将简单的参数绑定到body,使用[FromBody]
  • @PanagiotisKanavos 刚刚在一个用于 4.5 框架的仓库中发现它,并希望将其转换为 NET Core。它实际上不是 MVC,它的 API。而且形式上它不知道 DTO 的模型。
  • 而且你不应该尝试随机代码。您不会在文档、教程或课程中找到该课程。浏览ASP.NET documentation site 中的教程,了解 Web API 的实际工作原理

标签: c# asp.net-core-2.1


【解决方案1】:

FormDataCollection 随 Microsoft.AspNetCore.Mvc.WebApiCompatShim 没有无参数构造函数,因此这将是问题的原因。根据official documentation -

为了进行绑定,该类必须具有公共默认值 要绑定的构造函数和成员必须是公共可写属性。 当模型绑定发生时,该类将仅使用实例化 公共默认构造函数,然后可以设置属性。

【讨论】:

  • 我查看了 Microsoft.AspNet.WebApi.Client 中的 FormDataCollection。但你是对的,它没有无参数的构造函数。那么它的用例是什么?
  • 抱歉,用例是什么意思?在 asp.net 核心中?
  • 是的,在 asp.net 核心中。
  • @xneg 根据asp.net core中绑定的官方文档-“为了进行绑定,类必须有一个公共的默认构造函数,并且要绑定的成员必须是公共的可写属性。当模型绑定发生时,类将仅使用公共默认构造函数进行实例化,然后可以设置属性。”在我看来,它是为了向后兼容而移植的,比如如果你有很多使用 FormDataCollection 的代码。
  • 啊,谢谢。向后兼容似乎是合理的。会接受你的回答。
猜你喜欢
  • 1970-01-01
  • 2021-07-25
  • 2018-09-07
  • 2019-03-05
  • 2018-12-23
  • 2020-07-21
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多