>假设您有一个页面,其中路由/Checkout/Complete/1 完成了 OAuth google UserID 1 的订单。这在操作链接中实现如下:
@Html.ActionLink("Submit>>", "Complete", "Checkout",
new { id = WebSecurity.CurrentUserId }, null)
现在这种方法的最大缺陷是,填满购物车的网站用户只需输入/Checkout/Complete/2 之类的链接,并在另一个 UserId 上下订单,这样他们就不必付款。
我试图做的是在路由配置中创建一个条目,如下所示:
public static void RegisterRoutes(RouteCollection routes)
{
int currentUserId = WebSecurity.CurrentUserId;
routes.MapRoute(
name: "Checkout",
url: "{controller}/{action}/{id}",
defaults: new {controller = "Checkout", action = "Complete", id =
UrlParameter.Optional},
constraints: new { id = currentUserId }
);
}
不幸的是,这种方法不起作用。
如何创建一个约束来检查 Websecurity.CurrentUserId 是否与实际的 currentUserId 匹配,并以其他方式引用错误页面?如果有更好的方法来实现这一目标,我很想听听。
只要输入问题,我就可以更好地了解我想要完成的任务。我通过将 if 语句(id == WebSecurity.CurrentUserId)添加到 CheckoutController 文件解决了这个问题,如下所示:
// GET: /Checkout/Complete
[Authorize]
public ActionResult Complete(int id)
{
if (id == WebSecurity.CurrentUserId)
{
//do stuff
}
else {
//tell user to not do that
}
}
这行得通!
不幸的是,当您访问例如/Checkout/Complete/joe 时,我们仍然会收到以下消息:
The parameters dictionary contains a null entry for parameter 'id' of non-nullable
type 'System.Int32' for method 'System.Web.Mvc.ActionResult Complete(Int32)'
我认为这确实需要使用 routeconfig.cs 中的约束来修复。有人知道怎么做吗?