ASP.NET MVC 5 属性路由:Url.Action returns 空

ASP.NET MVC 5 Attribute Routing: Url.Action returns null

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

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

在此重构之前,MakePayment 操作方法在以下对 Url.Action() 的调用中正确地制定了正确的 return URL:

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

ProcessPayment 操作方法现已从产品控制器移出并移入新控制器 ExternalCallbackController,它具有 no 属性(让单独 [Authorize]),以避免向支付提供商发送 HTTP 401 响应 return。

ProcessPayment 上的路由属性现在是 [Route("order-processing/{productCode}/process-payment")] 以避免与产品控制器上的 RoutePrefix 冲突。所有对此更新操作方法的引用都更新为指定 ExternalCallbackController.

手动浏览到 URL 会触发设置在 ProcessPayment 内的断点,因此路由显然成功了。

问题是在MakePayment中,下面调用returns null:

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

鉴于我同时指定了控制器和操作方法,为什么 Url.Action(...) 没有 return 以 order-processing/{productCode}/process-payment 的形式 URL?

从第 1 天开始,我们在 RouteConfig 中的 RegisterRoutes() 方法已使用

正确初始化属性路由
routes.MapMvcAttributeRoutes();

如何从对 Url.Action(...) 的调用中获得正确的 URL return?

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

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

ProcessPayment() 操作方法。

这类似于以下内容(注意使用 productNumber 而不是 productCode):

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

正在尝试引用操作方法:

[Route("order-processing/{productCode}/process-payment")]
public ActionResult ProcessPayment(string productCode, string result)
{
    ...
}

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

我得到这个错误:Url.Action return 空。

public async Task<IActionResult> ForgotPassword(ForgotPassword forgotPassword)
    {
        if (ModelState.IsValid)
        { 
            // Find the user by email
            var user = await userManager.FindByEmailAsync(forgotPassword.Email);
            // If the user is found AND Email is confirmed
            if (user != null && await userManager.IsEmailConfirmedAsync(user))
            {
                // Generate the reset password token
                var token = await userManager.GeneratePasswordResetTokenAsync(user);
                // Build the password reset link
                var passwordResetLink = Url.Action("ResetPassword", "Account",
                        new { email = forgotPassword.Email, token }, Request.Scheme);
                ViewBag.PRL = passwordResetLink;

                // Send the user to Forgot Password Confirmation view
                return View("ForgotPasswordConfirmation");
            }
            return View("ForgotPasswordConfirmation");
        }

        return View(forgotPassword);
    }