2016-02-28 36 views
3

在我们的MVC应用程序,我们有一个路线定义如下:处理无效的MVC参数

routes.MapRoute("ViewUser", "ViewUser/{userId}", new { controller = "general", action = "viewuser", userId = 0 }); 

的userid但是偶尔定义为一个非可空类型为int,具有默认值为0,我们发现,谷歌广告机器人会因为一些未知的原因将该页面称为/ViewUser/phptest.php。这导致500错误:

The parameters dictionary contains a null entry for parameter 'userId' of non-nullable type 'System.Int32' 

对于现在,如果我们忽视的事实是谷歌正试图抓取无效的URL,反正是有强制404,而不是500错误?我能想到的是完全删除默认路由,并指定路由约束

回答

1

方式一:

routes.MapRoute(
    "ViewUser", 
    "ViewUser/{userId}", 
    new { controller = "general", action = "viewuser", userId = @"\d+" }); 

这样的路径将被用来只有当userId满足约束条件(数量在这种情况下)。而且由于你没有默认路由(或任何其他路由匹配请求),你应该得到一个404请求。

的缺点是,你必须明确地指定为所有的动作路径(无论是在Route.config或使用路由属性)

+0

你可以做到这一点'{用户名:INT}'也 – CodeNotFound

+0

如果我没错误这个选项只在ASP.NET MVC 5中添加了。 –

+0

在版本5中是的。的确。 – CodeNotFound