如何从一个异步操作重定向到另一个(MVC5)

时间:2014-12-15 12:15:17

标签: c# asp.net-mvc asynchronous

我的网站有管理员部分,我希望管理员能够添加新用户。 我也有一个单独的注册链接,它可以工作。

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

  1. 管理员填写用户信息
  2. AdminController检查它是否有效,然后重定向到AuthenticationController方法以创建用户
  3. 如果AuthController返回成功,则重新加载所有用户的列表
  4. 将此内容返回到部分以更新屏幕。
  5. 当我调试代码时,我点击了Admin控制器,但是我无法进入AuthController以查看它失败的原因。 (这一切都可以编译好)

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

    简单来说,代码是;

    [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。 (这让我怀疑异步无法正常工作)。

    我在这里的概念是否有任何问题,以及导致我看到的调试行为的原因是什么?

2 个答案:

答案 0 :(得分:0)

应该将RedirectToAction返回给响应,以便访问者的浏览器可以重定向到给定的URL。只有在发生这种情况之后才会点击RegisterAsyncFromOtherController行动。

答案 1 :(得分:0)

您似乎将RedirectToAction()Response.Redirect()混为一谈。

RedirectToAction()返回RedirectToRouteResult(继承自ActionResult),您必须将其返回给调用方才能使其生效。如果你不回复,RedirectToAction()什么都做不了?