ASP.NET MVC 5 属性路由:Url.Action returns 空
ASP.NET MVC 5 Attribute Routing: Url.Action returns null
我在重构我们的支付处理操作方法(由我们的第 3 方在线支付提供商调用)时遇到问题。我们有一个在 class 级别具有 [Authorize]
和 [RoutePrefix("products")]
属性的产品控制器,以及包括以下内容的操作方法:
Product(string contractNumber)
具有路由属性 [Route("{productCode}")]
MakePayment(string productCode, PaymentAmountType? amountSelection, decimal? amountValue)
具有路由属性 [Route("{productCode}")]
和 [HttpPost]
属性
ProcessPayment(string productCode, string result)
具有路由属性 [Route("{productCode}")]
因为我们的支付网关需要能够在访问者被重定向到相同的 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);
}
我在重构我们的支付处理操作方法(由我们的第 3 方在线支付提供商调用)时遇到问题。我们有一个在 class 级别具有 [Authorize]
和 [RoutePrefix("products")]
属性的产品控制器,以及包括以下内容的操作方法:
Product(string contractNumber)
具有路由属性[Route("{productCode}")]
MakePayment(string productCode, PaymentAmountType? amountSelection, decimal? amountValue)
具有路由属性[Route("{productCode}")]
和[HttpPost]
属性ProcessPayment(string productCode, string result)
具有路由属性[Route("{productCode}")]
因为我们的支付网关需要能够在访问者被重定向到相同的 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);
}