输入无效.Net Core Web API

Sou*_*osh 26 c# asp.net-core-webapi asp.net-core-2.0

我面临一个奇怪的问题,几乎花了4个小时没有运气.

我有一个简单的Web API,我在表单提交上调用.

API -

// POST: api/Tool
[HttpPost]
public void Post([FromBody] Object value)
{
    _toolService.CreateToolDetail(Convert.ToString(value));
}
Run Code Online (Sandbox Code Playgroud)

HTML的

<!DOCTYPE html>
<html>
<body>

<h2>HTML Forms</h2>
<form name="value" action="https://localhost:44352/api/tool" method="post">
  First name:<br>
  <input type="text" id="PropertyA" name="PropertyA" value="Some value A">
  <br>
  Last name:<br>
  <input type="text" id="PropertyB" name="PropertyB" value="Some value B">
  <br><br>
  <!--<input type="file" id="Files" name="Files" multiple="multiple"/>-->
  <br><br>
  <input type="submit" value="Submit">

  </form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

当我点击提交按钮时,我得到以下错误 -

{"":["The input was not valid."]}
Run Code Online (Sandbox Code Playgroud)

启动课程中的配置 -

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    services.AddSingleton<IConfiguration>(Configuration);
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseMvc();
}
Run Code Online (Sandbox Code Playgroud)

这仅适用于POST请求.GET请求正常.在Postman REST客户端中进行测试时出现同样的问题 有什么帮助吗?如果我能提供更多详细信息,请通知我.

Chr*_*att 33

不要用FromBody.您正在提交x-www-form-urlencoded(即标准HTML表单帖子).该FromBody属性适用于JSON/XML.

您无法同时处理标准表单提交 JSON/XML请求正文.如果您需要双向请求操作,则需要两个单独的端点,一个使用param装饰,FromBody另一个不使用.没有其他办法.您的操作的实际功能可以分解为两个操作都可以使用的私有方法,以减少代码重复.


Ada*_*mph 12

我刚刚在这里遇到了类似的情况; 我能够毫无问题地使用[FromBody]:

public class MyController : Controller
{
   [HttpPost]
   public async Task<IActionResult> SomeEndpoint([FromBody]Payload inPayload)
   {
   ...
   }
}

public class Payload
{
   public string SomeString { get; set; }
   public int SomeInt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我发现的挑战是确保使用Content-Type标头设置为"application/json"来进行请求.使用Postman我的原始请求被返回为"输入无效".添加Content-Type标头为我解决了问题.

  • [FromForm]填充HTML表单中的参数; 而[FromBody]填充HTTP请求正文(有效负载)中的参数.此外,还有一个[FromQuery]将转录查询字符串中的变量.你正在寻找的那个将取决于你如何收到请求 - 当然你可以支持所有三个,并让每个人参考一个私人功能来完成实际工作.但这有点偏离主题...... (2认同)

Ped*_*ani 7

只需更改[FromBody]为即可[FromForm]
FromForm属性用于按内容类型发送的提交表单中的传入数据,application/x-www-url-formencodedFromBody会以默认方式解析模型,默认方式是application/json从请求正文按内容类型发送。
感谢/sf/answers/3531790181/