我尝试制作一个PUT控制器方法,将Guid与身体绑定,但无论我发送什么JSON身体,Guid总是为空。我的函数方法的一个最小例子如下所示:
[HttpPut("Test/{guidThatWorks:guid}")]
[Consumes("application/json")]
[Produces("application/json")]
public async Task<IActionResult> Test(Guid guidThatWorks, [FromBody] Guid testId)
{
return Ok();
}
当我在Swagger或Postman中调用此方法时, guidThatWorks 设置正确,但 testId 始终为null。 我发送的正文如下:
"cef0cbf3-6458-4f13-a418-ee4d7e7505df"
然后我尝试将 testId 的类型更改为字符串,它完全正常。
之后,我想知道它与对象的行为方式。所以,我创建了以下测试对象:
public class TestRequest
{
public Guid? TestId { get; set; }
public string TestString { get; set; }
}
并改变了我的方法如下:
[HttpPut("Test/{guidThatWorks:guid}")]
[Consumes("application/json")]
[Produces("application/json")]
public async Task<IActionResult> Test(Guid guidThatWorks, [FromBody] TestRequest testRequest)
{
return Ok();
}
现在,发生以下情况:
如果我发送这个JSON正文:
{
"testString": "string"
}
testRequest 被实例化, TestString 的值具有值&#34; string&#34;并且 TestId 为空。
所以,我至少知道绑定原则上是有效的。但是如果我发送一个试图设置Guid的身体:
{
"testString": "string",
"testId": "cef0cbf3-6458-4f13-a418-ee4d7e7505df"
}
testRequest 无法再绑定并且为空。
我做错了吗?我认为它适用于 guidThatWorks ,因为它使用不同的绑定器。但是我发现一些消息来源说你应该能够将Guid绑定到身体上。
编辑:当我第二天回来时,当我想再次调试它并检查模型状态时,这个问题以某种方式解决了,正如有人建议的那样,它只是起作用。看起来像一些奇怪的错误,通过重新启动我的系统或重新打开Visual Studio来修复...
答案 0 :(得分:4)
你的guid无效。 Guid是16个字节,因此以十六进制形式它应该包含32个字符。从字符串解析时,.NET期望它的形式为:
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX < 32 characters in total
但是你的guid包含31个十六进制字符:
cef0cbf3-6458-4f13-a418-ee4d7e7505d
^ one is missing
毫无疑问,它无法绑定。
答案 1 :(得分:0)
当我第二天回来时,当我想再次调试并检查模型状态时,这个问题以某种方式解决了,正如有人建议的那样,它只是起作用了。看起来像一些奇怪的错误,通过重新启动我的系统或重新打开Visual Studio来修复。