0

假设您有一个页面,其中路由 /Checkout/Complete/1 完成了 OAuth google UserID 1 的订单。这在 ActionLink 中实现如下:

@Html.ActionLink("Submit>>", "Complete", "Checkout",
    new { id = WebSecurity.CurrentUserId }, null)

现在,这种方法的最大缺陷是,填满购物车的网站用户只需输入 /Checkout/Complete/2 之类的链接,然后将订单放在另一个 UserId 上,这样他们就不必付款。

我试图做的是在 routeconfig 中创建一个如下所示的条目:

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 匹配,否则会引用错误页面?如果有更好的方法来实现这个目标,我很想听听他们的意见。

4

1 回答 1

0

好的,只需输入问题,我就可以更好地了解我要完成的工作。我通过将 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 中的约束来解决。有人知道怎么做吗?

于 2013-11-06T15:39:03.903 回答