【问题标题】:How do I redirect from one Async Action to Another (MVC5)如何从一个异步操作重定向到另一个(MVC5)
【发布时间】:2014-12-15 12:15:17
【问题描述】:

我的网站有一个管理员部分,我希望管理员能够在其中添加新用户。 我还有一个单独的注册链接,可以使用。

我想使用ajax 来更新我的管理部分。所以计划是:

  1. 管理员填写用户信息表格
  2. AdminController 检查是否有效,然后重定向到AuthenticationController 方法创建用户
  3. 如果AuthController返回成功,则重新加载所有用户列表
  4. 将此返回到部分以更新屏幕。

当我调试代码时,我点击了管理控制器,但我无法进入 AuthController 以查看它失败的原因。 (一切编译OK)

我认为这与我的两个方法都是异步的这一事实有关,但我不能等待从一个到另一个的重定向。

简单来说,代码是;

[Authorize(Roles = "AccessAllAreas")]
[HttpPost]
[ValidateAntiForgeryToken()]        
public async Task<PartialViewResult> CreateNewUser(ApplicationUserViewModel avm)
{
    if (ModelState.IsValid)
    {
        try
        {
            var foo = RedirectToAction("RegisterAsyncFromOtherController", "Account", avm);

    ....
    }

[Authorize(Roles = "AccessAllAreas")]
[ValidateAntiForgeryToken()]
public async Task<ActionResult> RegisterAsyncFromOtherController(ApplicationUserViewModel model)
{
    if (ModelState.IsValid)
    {
        ....
    }
}

上述if (Modelstate.IsValid) 上的断点永远不会被击中。然而,一个断点然后进入对RegisterAsyncFromOtherController()的调用会访问视图模型上的一个属性,然后它返回到CreateNewUser。 (这让我怀疑异步工作不正常)。

我在这里的概念有什么问题吗?是什么导致了我看到的调试行为?

【问题讨论】:

  • 在那之后你对foo 变量做了什么?它已经消失在未闭合的花括号中。
  • 重定向到方法永远不会返回,因此该行之后的代码与手头的问题无关。
  • 您是说在调试器中运行代码之后,还是基于您的假设? RedirectToAction() 确实 返回,您必须使用它的返回值才能使其发挥作用。有关详细信息,请参阅我的答案。
  • 我使用了调试器,重定向到只是消失在以太中。我认为您的分析器是有道理的,所以这让我想知道是否有更好的方法来实现我想做的事情,或者我返回浏览器告诉它重定向到帐户控制器,然后需要重定向到我的管理部分。 (只是看起来有点笨拙!)

标签: c# asp.net-mvc asynchronous


【解决方案1】:

RedirectToAction 应该返回到响应中,以便访问者的浏览器可以重定向到给定的 url。只有在这发生之后,您才会点击RegisterAsyncFromOtherController 操作。

【讨论】:

    【解决方案2】:

    您似乎将RedirectToAction()Response.Redirect() 混淆了。

    RedirectToAction() 返回一个RedirectToRouteResult(继承自ActionResult),您必须将其返回给调用者才能使其生效。不退货,RedirectToAction()就什么都不做?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多