2015-02-25 3 views
0

Мне нужно повторно отправить ссылку активации пользователю, если он потерял бывшее письмо по этой ссылке.Как вызвать метод от контроллера, нажав на ссылку

Итак, я проверил статус пользователя в Вход метода:

 [HttpPost] 
     [AllowAnonymous] 
     [ValidateAntiForgeryToken] 
     public ActionResult Login(LoginModel model, string returnUrl) 
     { 
      bool isConfirmed = (model == null) ? false : WebSecurity.IsConfirmed(model.UserName); 
      string errorMsg = "Login or password is incorrect."; 

     if (isConfirmed) 
     { 
      if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe)) 
      { 
       return RedirectToLocal(returnUrl); 
      } 
     } 
     else 
     { 
      if (WebSecurity.UserExists(model.UserName)) 
      { 
       errorMsg = "Your account is not activated. Click <a href=\"" + Url.Content("~/Account/ResendConfirmationLink") + "?id=" + model.UserName +"\" class=\"alert-link\">here</a> for resend email with activation link."; 
      } 
     } 

     // If we got this far, something failed, redisplay form 
     ModelState.AddModelError("", errorMsg); 
     return View(model); 
    } 

Над кодом генерировать ссылку, как http://localhost:64612/Account/ResendConfirmationLink?id=nickname так, щелкнув по нему мы должны вызвать следующий метод (от контроллера счета):

 [HttpGet] 
     public ActionResult ResendConfirmationLink(string id) 
     { 
      using (ChatContext chatContxt = new ChatContext()) 
      { 
       var tsqlQuery = string.Format("SELECT [ConfirmationToken] FROM [webpages_Membership] WHERE [UserId] IN (SELECT [UserId] FROM [User] WHERE [UserName] LIKE '{0}')", id); 
       string confirmationToken = chatContxt.Database.SqlQuery<string>(tsqlQuery).First(); 
       tsqlQuery = string.Format("SELECT [Email] FROM [User] WHERE [UserName] LIKE '{0}'", id); 
       string email = chatContxt.Database.SqlQuery<string>(tsqlQuery).First(); 
       SendEmail(email, confirmationToken); 
      } 
      return View("Login"); 
     } 

Но метод ResendConfirmationLink() никогда не называется! Просмотр входа перезагружается, а URL-адрес преобразуется в http://localhost:64612/Account/Login?ReturnUrl=%2fAccount%2fResendConfirmationLink%3fid%3dusername1&id=username1.

Что я делаю неправильно? Почему метод не звонит, нажимая на ссылку?

ответ

5

Необходимо добавить аннотацию [AllowAnonymous] к вашему действию ResendConfirmationLink.

Он хочет, чтобы пользователь был аутентифицирован до того, как он называет этот метод, который вам не нужен.

+0

ой, вы правы, теперь работает отлично. Благодаря! –

1

Вы делаете две ошибки следующим образом

  1. Прежде всего вы должны добавить [AllowAnonymous] атрибут к методу ResendConfirmationLink.

  2. Вы должны изменить свой resedconfirmation URL-адрес

    http://localhost:64612/Account/ResendConfirmationLink?username=nickname 
    

в

 http://localhost:64612/Account/ResendConfirmationLink?id=nickname 
+0

Вторая ошибка - это просто копирование-вставка, извините, я отредактирую свой пост и изменю его. В любом случае спасибо за решение первой ошибки. –

Смежные вопросы