Net Net MVC

时间:2019-04-29 12:01:43

标签: c# rest api asp.net-core

我注意到.Net Core中MVC路由的意外行为。由于我没有想到该行为,并且我不知道解决此问题的简单方法,因此请您提供帮助。 :)

[HttpPut("obj/{pk?}")]
public IActionResult SaveObj(decimal? pk, [FromBody] ObjDef obj)
{
[..]
}

一切正常。我可以通过请求放入/obj来添加新对象,并通过请求/obj/1来更新它。

我的惊奇是,当我请求像/obj/AStringValue这样的uri时,SaveObj方法仍然被调用,并且PK值为空,因此如果请求具有正确的有效负载,就会创建新的obj。

我希望获得404标头,因为显然在我的任何控制器中都没有声明这样的路径。

作为一种解决方法,我已经制定了两种方法-一种具有强制性十进制参数PK,而另一种根本没有任何参数,但是随后仍然具有十进制PK的方法被触发,pk等于0!我认为这是完全错误的。

我应该如何处理这种行为?还是我在这里做错了...

我的AspNetCore MVC版本是2.2.0

1 个答案:

答案 0 :(得分:2)

您可以使用route constraint来验证路由参数的类型。如果约束失败,则返回404,好像该路由根本不存在。就您而言,您可以使用decimal约束,如下所示:

[HttpPut("obj/{pk:decimal?}")]

这表明pk是可选的,但是提供时,它必须是有效的十进制值。