我曾经只是将简单的JSON对象发送到ASP.NET MVC控制器,并且绑定引擎将其解析为方法的简单参数:
{
"firstname" : "foo",
"lastname" : "bar"
}
我可以像这样拥有一个MVC控制器:
public method Blah(string firstname, string lastname) {}
firstname
和 lastname
将会自动从Json对象中拉取并映射到相应的简单参数中。
我将一个后端组件迁移到了.NET Core 5.0,方法签名保持不变,然而,当我提交相同的简单JSON对象时,我的参数是null。我甚至尝试对每个参数都使用[FromBody]
,但它们仍然是null。直到我创建了一个包含参数名的额外类,模型绑定才能生效:
public class BlahRequest
{
public string firstname { get; set;}
public string lastname { get; set; }
}
然后我必须更新我的方法签名,看起来像这样:
public method Blah([FromBody]BlahRequest request) { }
现在,请求中有firstname
和lastname
属性,这些属性是从post请求中填写的。
是否有一个模型绑定器设置,可以让我回到将一个简单的Json对象绑定到方法参数的方式?或者我必须更新所有的方法签名来包含具有属性的类?
Web API方法调用方式
原始应用程序是使用Angular编写的,但我可以用一个简单的Fiddler请求重新创建它:
POST https://localhost:5001/Blah/Posted HTTP/1.1
Host: localhost:5001
Connection: keep-alive
Accept: application/json, text/plain, */*
Content-Type: application/x-www-form-urlencoded
{"firstname":"foo","lastname":"bar"}
在之前的.Net框架版本中,控制器方法会自动解析这些值。现在,在Core上,需要传递一个模型。我尝试了application/json、multipart/form-data和application/x-www-form-urlencoded作为Content-type,它们最终都得到了空值。
最小的.Net Core项目
public class Startup {
public Startup(IConfiguration configuration) {
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services){
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
app.UseHttpsRedirection();
app.UseRouting();
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
}
}
[Route("[controller]/[action]")]
public class BlahController : ControllerBase {
public object Posted(string firstname, string lastname) {
Console.WriteLine(firstname);
Console.WriteLine(lastname);
return true;
}
}
public method Blah(string firstname, string lastname) {}
,我尝试以{"firstname": "John", "lastname": "Smith"}
的格式传递 JSON,但是方法不会绑定它们,除非我添加一个中间模型。 - Campbell