C# 使用post方法将多个参数发送到asp.net core 3 mvc操作

C# 使用post方法将多个参数发送到asp.net core 3 mvc操作,c#,asp.net-mvc,asp.net-core-mvc,asp.net-core-3.0,C#,Asp.net Mvc,Asp.net Core Mvc,Asp.net Core 3.0,使用http post方法将具有多个参数的ajax请求发送到asp.net mvc core 3操作时出现问题。参数不绑定。在.net框架asp.net web api中也有类似的限制,但在asp.net mvc操作中没有。 我想知道asp.net core 3 mvc中是否有解决此问题的方法,或者这是新的限制? 行动: 尝试在控制器签名中添加[FromBody]属性 public string SomeAction([FromBody] string param1, IEnumerable&l

使用http post方法将具有多个参数的ajax请求发送到asp.net mvc core 3操作时出现问题。参数不绑定。在.net框架asp.net web api中也有类似的限制,但在asp.net mvc操作中没有。 我想知道asp.net core 3 mvc中是否有解决此问题的方法,或者这是新的限制? 行动:


尝试在控制器签名中添加
[FromBody]
属性

public string SomeAction([FromBody] string param1, IEnumerable<SomeType> param2, IEnumerable<SomeType> param3)
{
       //param1 and param2 and param3 are null
}
公共字符串SomeAction([FromBody]字符串参数1、IEnumerable参数2、IEnumerable参数3)
{
//param1、param2和param3为空
}

对于新版本,操作需要明确说明希望从何处绑定模型

创建一个模式来保存所有必需的数据

public class SomeActionModel {
    public string param1 { get; set; }
    public IEnumerable<SomeType> param2 { get; set; }
    public IEnumerable<SomeType> param3 { get; set; }
}

参考中描述了单个
[FromBody]
参数的原因。请求主体可能存储在只能读取一次的非缓冲流中


使用自定义模型活页夹,您可以绕过它。请参阅。

是否有任何错误?没有。仅获取空参数扫描您使用对象包装参数并尝试使用[FromBody]属性?如果可能,将所有
参数
放在一个
模型类中
@Ma core是对以前版本的完全重写。MVC5+中的一些功能在新版本中得到了改进,而不是JSON。JSON的字面意思是“对象表示法”,所以您需要将它绑定到一个对象,而不是一堆不同的参数。您可以通过
x-www-form-urlencoded
发送,并将其绑定到多个参数,因为它只是键值对。在有复杂对象的地方使用FromBody属性。当我们试图告诉mvc请求的数据在请求体中时。但是这里您指定的函数参数只是简单类型而不是复杂对象,即使它看起来不像复杂对象,第二个和第三个参数是
IEnumerable
SomeType
可能是也可能不是复杂类型,在querystring中使用时,
Enumerable
很容易导致[一个巨大的querystring&一些问题]()。
public string SomeAction([FromBody] string param1, IEnumerable<SomeType> param2, IEnumerable<SomeType> param3)
{
       //param1 and param2 and param3 are null
}
public class SomeActionModel {
    public string param1 { get; set; }
    public IEnumerable<SomeType> param2 { get; set; }
    public IEnumerable<SomeType> param3 { get; set; }
}
public IActionResult SomeAction([FromBody] SomeActionModel model) {
    if(ModelState.IsValid) {
        string param1 = model.param1;
        IEnumerable<SomeType> param2 = model.param2;
        IEnumerable<SomeType> param3 = model.param3;

        //...

        return Ok();
    }

    return BadRequest(ModelState);
}
var model = {
    param1: GeometricNetworkTrace_Class.flags,
    param2: GeometricNetworkTrace_Class.barriers,
    param3: feederIds
};

$.ajax({
    contentType: 'application/json',
    data: JSON.stringify(model),
    type: "POST",
    dataType: "json",
    url: "/controllerName/actionName",
    success: function (result) {
    },
    error: function (error) {
        console.error(error);
    }
});