guid与身体结合不可能?

时间:2018-03-26 11:42:46

标签: c# asp.net-core model-binding

我尝试制作一个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来修复...

2 个答案:

答案 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来修复。