我注意到.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
答案 0 :(得分:2)
您可以使用route constraint来验证路由参数的类型。如果约束失败,则返回404,好像该路由根本不存在。就您而言,您可以使用decimal
约束,如下所示:
[HttpPut("obj/{pk:decimal?}")]
这表明pk
是可选的,但是提供时,它必须是有效的十进制值。