And*_*rew 16 url error-handling asp.net-mvc
处理访问者构建自己的URL并用他们喜欢的任何内容替换我们期望的ID的最佳方法是什么?
例如:
但是用户可以轻松地将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中路由的惰性,将它放在链的上方将意味着它将处理它下面的所有其他内容.
这是一些可能有用的有用信息.如果你有一个行动方法
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不是空值,那么它是一个有效的整数,可以传递给您的服务等以进行数据库交互.
希望这能为您提供我在测试时发现的一些信息.
| 归档时间: |
|
| 查看次数: |
5004 次 |
| 最近记录: |