我有一个使用MVC4构建的面向互联网的网站,我偶尔会从漫游器或好奇的用户那里获取错误报告,这些用户发送不完整的URL请求。忽略由于缺少控制器参数导致的异常
例如:
public class ProductController : Controller
{
[HttpGet]
public void View(int id)
{
// ...
- GET请求到
/product/view/1
是有效的。 - 由于未指定参数,所以对
/product/view
的GET请求无效。
这种无效的请求,引发异常相似:
System.ArgumentException: The parameters dictionary contains a null entry
for parameter 'id' of non-nullable type 'System.Int32' for method
'System.Web.Mvc.ActionResult View(Int32)' in 'Foo.ProductController'. An
optional parameter must be a reference type, a nullable type, or be declared
as an optional parameter.
Parameter name: parameters
at System.Web.Mvc.ActionDescriptor.ExtractParameterFromDictionary(ParameterInfo parameterInfo, IDictionary`2 parameters, MethodInfo methodInfo)
at System.Web.Mvc.ReflectedActionDescriptor.<>c__DisplayClass1.<Execute>b__0(ParameterInfo parameterInfo)
...
由于异常消息的状态,我可以使id
参数空,但操作方法内检查,但我有许多控制器与许多行动。
我想返回一个BadRequest
/NotFound
对任何无法将参数绑定到操作参数的请求的响应,并在代码中的一个位置指定此值以跨所有控制器应用。
这怎么办?
在你定义控制器和动作和参数定义的路由配置中,你可以指定参数为可空。 –
@AnirudhAgarwal当尝试将null转换为int时,可能会抛出int –
@AirirhAgarwal,如果我为'id'包含一个我不想做的默认值,那么工作的唯一方法就是。如果在操作中定义了“id”并且它没有提供,那么客户端犯了一个错误,我想给他们发送404。另外,我有各种不同的控制器,每个控制器都需要在我的路由配置中输入。这里的要点是,我不希望在我的操作和配置中进行自定义更改,以防万一某个用户/机器人发送无效请求 - 它们应该集中处理,并且不会引发导致我收到错误电子邮件的异常只需删除。 –