Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Asp.net mvc 控制器操作未从JSON读取Guid POST_Asp.net Mvc_Asp.net Web Api_Asp.net Core Mvc - Fatal编程技术网

Asp.net mvc 控制器操作未从JSON读取Guid POST

Asp.net mvc 控制器操作未从JSON读取Guid POST,asp.net-mvc,asp.net-web-api,asp.net-core-mvc,Asp.net Mvc,Asp.net Web Api,Asp.net Core Mvc,我将控制器操作声明为: [Route("api/person")] [HttpPost] public async Task<IActionResult> Person([FromBody] Guid id) { ... } 正在命中我的操作,但它接收的Guid始终是Guid.Empty值(即:它没有得到我传递的值) 注意,如果我使用url参数而不是[FromBody],这很好,但我希望使用http帖子的正文。如中所述: 默认情况下,Web API使用以下规则绑定参数: 如果参数

我将控制器操作声明为:

[Route("api/person")]
[HttpPost]
public async Task<IActionResult> Person([FromBody] Guid id) { ... }
正在命中我的操作,但它接收的
Guid
始终是
Guid.Empty
值(即:它没有得到我传递的值)

注意,如果我使用url参数而不是
[FromBody]
,这很好,但我希望使用http帖子的正文。

如中所述:

默认情况下,Web API使用以下规则绑定参数:

  • 如果参数是“简单”类型,Web API将尝试从URI获取值。简单类型包括.NET基本类型(int, bool、double等),加上TimeSpan、DateTime、Guid、decimal, 和字符串,再加上任何具有可从 一串。(稍后将详细介绍类型转换器。)
  • 对于复杂类型,Web API尝试使用媒体类型格式化程序从消息体读取值
部分的同一篇文章中,使用[FromBody]可以看到一个示例,您可以在参数上添加属性
[FromBody]
,以绑定请求正文中的值,就像您所做的那样。但这里是catch-sample显示的,在这种情况下,请求主体应该包含原始值,而不是JSON对象

因此,在您的情况下,您有两种选择:

第一个选项是更改请求以提供原始值,而不是JSON对象

POST /api/person HTTP/1.1
Host: localhost:5000
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 747a5d76-398c-e1c7-b948-b276bb24976c

"b85f75d8-e6f1-405d-90f4-530af8e060d5"
第二个选项是提供具有单个属性的复杂对象,并将其用作参数:

public class Request
{
    public Guid Id { get; set; }
}

[Route("api/person")]
[HttpPost]
public async Task<IActionResult> Person([FromBody] Request request) { ... }
公共类请求
{
公共Guid Id{get;set;}
}
[路线(“api/人”)]
[HttpPost]
公共异步任务人员([FromBody]请求){…}

id不应该是原始JSON字符串而不是对象吗?所以只需“b85f75d8-e6f1-405d-90f4-530af8e060d5”?同时,传入一个字符串,然后将TryParse传递给Guid。我会在我的机器上测试这个,但是我的VS正在安装。这主意不错。我在移动设备上,但会在早上进行测试。您说“第一个选项是更改您的请求以提供原始值而不是JSON对象”,但在您给出的示例中,上下文类型为:application/JSON。在第二个选项中,您仍然需要为其提供Guid,该Guid再次失败:{“request”:{“Id”:“e01b8040-8fd7-4227-a55a-111111”}
public class Request
{
    public Guid Id { get; set; }
}

[Route("api/person")]
[HttpPost]
public async Task<IActionResult> Person([FromBody] Request request) { ... }