gpt4 book ai didi

ASP.NET MVC 5 属性路由 : Url. 操作返回 null

转载 作者:行者123 更新时间:2023-12-01 02:11:31 25 4
gpt4 key购买 nike

我在重构我们的支付处理操作方法(由我们的第 3 方在线支付提供商调用)时遇到问题。我们有一个带有 [Authorize] 的产品 Controller 和 [RoutePrefix("products")]类级别的属性和操作方法,包括以下内容:

  • Product(string contractNumber)带有路由属性 [Route("{productCode}")]
  • MakePayment(string productCode, PaymentAmountType? amountSelection, decimal? amountValue)带有路由属性 [Route("{productCode}")][HttpPost]属性
  • ProcessPayment(string productCode, string result)带有路由属性 [Route("{productCode}")]

  • 因为我们的支付网关需要能够调用我们的 ProcessPayment在访问者被重定向到同一个 URL 之前的操作,我们不得不将其重构为没有 [Authorize] 的单独 Controller 属性。 (我们已经有了防止重复记入付款的机制。)

    在此重构之前, MakePayment action 方法在以下对 Url.Action() 的调用中正确地制定了正确的返回 URL。 :
    var rawCallbackUrl = Url.Action("ProcessPayment", new { productCode = productCode });
    ProcessPayment action 方法现在已从产品 Controller 中移出并移到新 Controller 中, ExternalCallbackController ,它没有属性(更不用说 [Authorize] ),以避免将 HTTP 401 响应返回给支付提供商。
    ProcessPayment 上的路由属性现在是 [Route("order-processing/{productCode}/process-payment")]避免与 RoutePrefix 发生冲突在产品 Controller 上。对这个更新的操作方法的所有引用都更新为指定 ExternalCallbackController .

    手动浏览到 URL 会导致在 ProcessPayment 内设置断点被击中,所以这条路线显然是成功的。

    问题是在 MakePayment ,以下调用返回 null :
    var rawCallbackUrl = Url.Action("ProcessPayment", "ExternalCallback", new { productCode = productCode });

    鉴于我同时指定了 Controller 和操作方法,为什么是 Url.Action(...)未返回 order-processing/{productCode}/process-payment 形式的预期 URL ?

    从第一天起,我们的 RegisterRoutes() RouteConfig 中的方法已经正确初始化了属性路由
    routes.MapMvcAttributeRoutes();

    如何从对 Url.Action(...) 的调用中返回正确的 URL ?

    最佳答案

    Doh - 我已经弄清楚出了什么问题。尽管对源代码中的名称(特定于我们的客户端)进行了清理,但事实证明以下调用中存在不匹配:

    var rawCallbackUrl = Url.Action("ProcessPayment", "ExternalCallback", new { productCode = productCode });

    ProcessPayment() Action 方法。

    这类似于以下内容(注意使用 productNumber 而不是 productCode ):
    var rawCallbackUrl = Url.Action("ProcessPayment", "ExternalCallback", new { productNumber = productNumber });

    试图引用 Action 方法:
    [Route("order-processing/{productCode}/process-payment")]
    public ActionResult ProcessPayment(string productCode, string result)
    {
    ...
    }

    事实证明,我也可以使用相同的前缀“products”而不是“order-processing”,因为 MVC 创建了一个 Route路由表中的每个属性路由。希望能帮助其他陷入类似情况的人。

    关于ASP.NET MVC 5 属性路由 : Url. 操作返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28800618/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com