Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有多个字符串类型参数的HttpPost。为什么两个参数都为空?_C#_Asp.net Core_Http Post_Asp.net Core Webapi_Asp.net Core 3.0 - Fatal编程技术网

C# 具有多个字符串类型参数的HttpPost。为什么两个参数都为空?

C# 具有多个字符串类型参数的HttpPost。为什么两个参数都为空?,c#,asp.net-core,http-post,asp.net-core-webapi,asp.net-core-3.0,C#,Asp.net Core,Http Post,Asp.net Core Webapi,Asp.net Core 3.0,我有一个API控制器,如下所示: [ApiController] [Route("test")] public class TestController : ControllerBase { [HttpPost] public IActionResult PostData(string param1, string param2) { if (string.IsNullOrEmpty(param1) || string.IsNullOrEmpty(para

我有一个API控制器,如下所示:

[ApiController]
[Route("test")]
public class TestController : ControllerBase
{
    [HttpPost]
    public IActionResult PostData(string param1, string param2)
    {
        if (string.IsNullOrEmpty(param1) || string.IsNullOrEmpty(param2))
        {
            return BadRequest();
        }

        string result = "result =  " + param1 + "." + param2;
        return new JsonResult(result );
    }
}
当我试图从postman访问它时,在编写post请求时,我在json正文中使用以下内容

{
    "param1" : "abc",
    "param2": "def"
}
但是,这会导致错误的请求。如果我在PostData方法上添加一个断点,它将到达第一行,在那里我对null或空字符串进行检查,并且两个参数都为null。这让我觉得我没有在客户端正确构建json。有人能指出我可能做错了什么吗?

这是我的方法

[Route("api/[controller]")]
[ApiController]
public class HomeController : ControllerBase
{
....
    [HttpPost("[action]")]
    public string GetStudentData_1(string p1, string p2)
    {
        return p1 + p2;
    }
}
我就是这么叫它的

第二种方法是传递有效的Json。将控制器方法更改为:

[HttpPost("[action]")]
public string GetStudentData_1([FromBody]JObject data)
{
    return data["p1"].ToString() + data["p2"].ToString() ;
}
确保JSON有效,并在Body/Raw中选择JSON application/JSON:

数据[p1]和数据[p2]允许您访问参数。为JObject和

尝试改用FormCollection

试试这个[FromBody]


如果使用asp.net core 3.0,则可以使用JsonElement接收json:

[HttpPost]
public string PostData([FromBody]JsonElement data)
{
    var param = "";
    var json = JsonSerializer.Serialize<dynamic>(data);
    using (JsonDocument doc = JsonDocument.Parse(json))
    {
        JsonElement root = doc.RootElement;
        var param1 = root.GetProperty("param1");
        var param1data = param1.GetString();
        var param2 = root.GetProperty("param2");
        var param2data = param2.GetString();
        param = param1data + param2data;
    }
    return param;
}
3.控制员:

[HttpPost]
public string PostData([FromBody]JObject data)
{
    return data["param1"].ToString() + data["param2"].ToString();
}

1.使用application/x-www-form-urlencoded:param1=abc¶m2=def 2。或者创建一个DTO类公共类DTO{public string Param1{get;set;}public string Param2{get;set;}}}并将方法更改为PostDataDto payloadI我不想使用DTO类,而更喜欢使用json。这在约束条件下是可能的吗?如果只有一个参数,这是可能的。但是,它不适用于您的场景:JSON需要在绑定参数之前反序列化HTTP正文如果您使用javascript发布JSON数据,您可能需要JSON.StringifyJSONObject您现在解决了问题了吗?如果我的答案对您有帮助,您可以回答我的问题吗?我不喜欢通过查询参数传递它。是否可以将其更改为在正文中传递参数?@BKS-使用Raw。这就是我正在使用的,并导致两个参数在正文中都为nullAPI@BKS-你试过第二种方法吗?
public IActionResult PostData([FromBody]string param1, [FromBody]string param2)
[HttpPost]
public string PostData([FromBody]JsonElement data)
{
    var param = "";
    var json = JsonSerializer.Serialize<dynamic>(data);
    using (JsonDocument doc = JsonDocument.Parse(json))
    {
        JsonElement root = doc.RootElement;
        var param1 = root.GetProperty("param1");
        var param1data = param1.GetString();
        var param2 = root.GetProperty("param2");
        var param2data = param2.GetString();
        param = param1data + param2data;
    }
    return param;
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
            .AddNewtonsoftJson();
}
[HttpPost]
public string PostData([FromBody]JObject data)
{
    return data["param1"].ToString() + data["param2"].ToString();
}