ASP.Net MVC - 处理错误的URL参数

And*_*rew 16 url error-handling asp.net-mvc

处理访问者构建自己的URL并用他们喜欢的任何内容替换我们期望的ID的最佳方法是什么?

例如:

ASP.Net MVC - 处理错误的URL参数

但是用户可以轻松地将URL替换为:

https://stackoverflow.com/questions/foo

我已经考虑过将每个Controller Function参数设置为a String并使用Integer.TryParse()它们 - 如果通过那么我有一个ID并且可以继续,否则我可以将用户重定向到Unknown/not-found或index View.

Stack Overflow很好地处理它,我也想 - 你怎么做,或者你会建议什么?

Dan*_*son 12

这是一个像你这样的路线的例子,对数字有一个约束:

routes.MapRoute(
    "Question",
    "questions/{questionID}",
    new { controller = "StackOverflow", action = "Question" },
    new { questionID = @"\d+" } //Regex constraint specifying that it must be a number.
);
Run Code Online (Sandbox Code Playgroud)

在这里,我们将questionID设置为至少有一个数字.这也将阻止任何包含除整数之外的任何url,并且还可以阻止对可空int的需要.

注意:这不会考虑大于Int32范围的数字(-2147483647 - +2147483647).我将此作为练习留给用户解决.:)

如果用户输入了网址"questions/foo",他们就不会点击"问题"操作,而是通过它,因为它不符合参数约束.如果您需要,可以在捕获/默认路径中进一步处理:

routes.MapRoute(
    "Catchall",
    "{*catchall}", // This is a wildcard routes
    new { controller = "Home", action = "Lost" }
);
Run Code Online (Sandbox Code Playgroud)

这会将用户发送到Home控制器中的Lost动作.有关通配符的更多信息,请访问此处.

注意:Catchall应该作为最后的路线.考虑到ASP.NET MVC中路由的惰性,将它放在链的上方将意味着它将处理它下面的所有其他内容.

  • 这看起来像处理疯狂用户的好方法=) (2认同)
  • 而不是最后一行:'new {questionID = @"\ d {1,}"}',Scott Hanselman使用稍短的语法:'new {questionID = @"\ d +"}'来表示同样的事情.资料来源:http://www.asp.net/learn/mvc-videos/video-7093.aspx (2认同)

Sch*_*ime 5

这是一些可能有用的有用信息.如果你有一个行动方法

public ActionResult Edit(int? id)
{}
Run Code Online (Sandbox Code Playgroud)

然后,如果有人输入

/Home/Edit/23
Run Code Online (Sandbox Code Playgroud)

参数id为23.但是如果有人输入

/Home/Edit/Junk
Run Code Online (Sandbox Code Playgroud)

然后id将为null,这很酷.我认为它会抛出一个演员错误或其他东西.这意味着如果id不是空值,那么它是一个有效的整数,可以传递给您的服务等以进行数据库交互.

希望这能为您提供我在测试时发现的一些信息.