2013-02-15 34 views
3

我想在我的MVC 4应用程序中实现任务操作方法。一切都在后面工作,但它不是重定向。MVC4 .NET 4.5异步操作方法不重定向

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 
    } 
} 
+0

如果删除了所有的'ClientHelper'代码,并只留下'重定向(会发生什么)'? – svick 2013-02-15 18:32:21

回答

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(); 
} 
+0

这没有多大意义。 – svick 2013-02-16 13:11:24

+1

晚会有点迟,但我想我已经清理了。他所做的一点是,如果调用者是异步的,那么被调用的任务必须是异步的。 – statue 2013-12-27 16:07:06

+0

您应该在回答中显示RedirectToAction方法的实现。 – 2017-02-26 06:54:36

0
[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(); 
     } 
} 

上述解决方案并没有为我工作