ASP.NETMVC-如何处理错误的URL参数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

处理访问者构建自己的URL并用他们喜欢的任何东西替换我们希望成为ID的最佳方式是什么?

我曾想过让每个控制器函数参数都是a String,并使用Integer.TryParse()它们 - 如果通过则我有一个ID并可以继续,否则我可以将用户重定向到未知/未找到或索引视图。

提问于
用户回答回答于

下面是一个类似于你的路线的例子,对数字有一个约束:

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

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

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

如果用户输入url“questions / foo”,他们将不会遇到问题操作,并且通过它,因为它没有参数约束。如果想要,您可以在catchall /默认路线中进一步处理它:

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

这会将用户发送到Home控制器中的Lost操作。有关通配符的更多信息可以在这里找到。

注意:Catchall应该作为LAST路线。将它放在链上将意味着这将处理其下的所有其他人,因为ASP.NET MVC中路由的惰性。

用户回答回答于

这里有一些有用的信息可能会有所帮助。如果你有一个行动方法

public ActionResult Edit(int? id)
{}

如果有人输入

/Home/Edit/23

参数ID将是23.但是,如果有人输入

/Home/Edit/Junk

那么id将为null,这非常酷。我认为它会抛出一个铸造错误或什么的。这意味着如果id不是一个空值,那么它是一个有效的整数,可以传递给你的服务等数据库交互。

扫码关注云+社区