MVC4 .NET 4.5异步操作方法不重定向

时间:2013-02-15 16:38:05

标签: c# asp.net-mvc .net-4.5 async-await

我正在尝试在我的MVC 4应用程序中实现任务操作方法。一切都在后面工作,但它没有重定向。

public class AccountController : AsyncController 
{
    [HttpPost]
    [AllowAnonymous]
    public async Task<ActionResult> Login(LoginModel model, string returnUrl)
    {
        var client = new ClientHelper("login");
        account = await client.CallActionType<LoginModel, Account>(EnumHelpers.HttpType.Post, model);

        if (account != null)
        {
            validLogin = true;
        }

        return Redirect(returnUrl); // This is called but the page does not redirect, just sits a load
    }
}

2 个答案:

答案 0 :(得分:4)

我在制作动作之后能够让它正常工作我也将它指向异步动作。我猜你是否有任何异步操作方法重定向到另一个,那么重定向也必须是异步的。

这是一个简单的例子

public async Task<ActionResult> Login(LoginModel model) {
    //You would do some async work here like I was doing.

    return RedirectToAction("Action","Controller");//The action must be async as well
}
public async Task<ActionResult> Action() {//This must be an async task 
    return View();
}

答案 1 :(得分:-1)

[Authorize]
    public class AccountController : Controller
    {
  [AllowAnonymous]
        public ActionResult Login(string returnUrl)
        {
            ViewBag.ReturnUrl = returnUrl;
            return View();
        }

        //
        // POST: /Account/Login
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {

                // find user by username first
                var user = await UserManager.FindByNameAsync(model.Email);

                if (user != null)
                {
                    var validCredentials = await UserManager.FindAsync(model.Email, model.Password);

                    // When a user is lockedout, this check is done to ensure that even if the credentials are valid
                    // the user can not login until the lockout duration has passed
                    if (await UserManager.IsLockedOutAsync(user.Id))
                    {
                        ModelState.AddModelError("", string.Format("Invalid credentials. Please try again, or contact support", 60));
                    }
                    // if user is subject to lockouts and the credentials are invalid
                    // record the failure and check if user is lockedout and display message, otherwise,
                    // display the number of attempts remaining before lockout
                    else if (await UserManager.GetLockoutEnabledAsync(user.Id) && validCredentials == null)
                    {
                        // Record the failure which also may cause the user to be locked out
                        await UserManager.AccessFailedAsync(user.Id);

                        string message;

                        if (await UserManager.IsLockedOutAsync(user.Id))
                        {
                            message = string.Format("Invalid credentials. Please try again, or contact support", 60);
                        }
                        else
                        {
                            int accessFailedCount = await UserManager.GetAccessFailedCountAsync(user.Id);

                            int attemptsLeft = (5 - accessFailedCount);

                            message = string.Format("Invalid credentials. Please try again, or contact support.", attemptsLeft);
                        }

                        ModelState.AddModelError("", message);
                    }
                    else if (validCredentials == null)
                    {
                        ModelState.AddModelError("", "Invalid credentials. Please try again, or contact support.");
                    }
                    else
                    {
                        await SignInAsync(user, model.RememberMe);

                        // When token is verified correctly, clear the access failed count used for lockout
                        await UserManager.ResetAccessFailedCountAsync(user.Id);

                        return RedirectToLocal(returnUrl);
                    }
                }
                else
                {
                    ModelState.AddModelError("", string.Format("Invalid credentials. Please try again, or contact support", 60));
                }
            }
            // If we got this far, something failed, redisplay form
            return View(model);
        }

  [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = await UserManager.FindByNameAsync(model.Email);
                if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
                {
                    // Don't reveal that the user does not exist or is not confirmed
                    //ModelState.AddModelError("", "The user either does not exist or is not confirmed.");
                    return RedirectToAction("ForgotPasswordConfirmation", "Account");
                }
                else
                {
                    var code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
                    var callbackUrl = Url.Action("ResetPassword", "Account",
                    new { UserId = user.Id, code = code }, protocol: Request.Url.Scheme);

                    string Data = System.IO.File.ReadAllText(Server.MapPath(@"~/documents/email_password_reset.txt"));

                    AspNetUser oUser = dbPortal.AspNetUsers.Find(user.Id);
                    // can't use string.format becuase of CSS                
                    Data = Data.Replace("{0}", oUser.Name);  // user name
                    Data = Data.Replace("{1}", callbackUrl); // URL to click
                    Data = Data.Replace("{2}", DateTime.Now.Year.ToString()); // copyright year
                    await UserManager.SendEmailAsync(user.Id, "Reset Password", Data);
                    return RedirectToAction("ForgotPasswordConfirmation", "Account");
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);

        }

        //
        // GET: /Account/ForgotPasswordConfirmation
        [AllowAnonymous]
       public async Task<ActionResult> ForgotPasswordConfirmation()
        {
            return View();
        }
}

上述解决方案对我不起作用