2013-01-11 29 views
3

我遇到了在我的GET控制器和我的視圖之間保留passwordToken的問題。我發現令牌被傳遞並在GET控制器中正確地添加到模型中,但是一旦HTML.BeginForm在View中啓動,模型中將有一個新實例,並且具有passwordToken的前一個模型將丟失。我需要保留passwordToken才能使用WebSecurity.ResetPassword。有關如何做到這一點的任何建議?在HTML.BeginForm模型中添加一個變量

我GET控制器:

[AllowAnonymous] 
    public ActionResult PasswordReset(string passwordToken) 
    { 
     // Token Validation 
     var usrID = WebSecurity.GetUserIdFromPasswordResetToken(passwordToken); 
     var usr = _dbManager.GetUserInformation(usrID); 

     if (usr == null) 
     { 
      //The link you are using is not valid anymore 
      return RedirectToAction("Error", "Account"); 
     } 
     else 
     { 
      var model = new PasswordReset(); 
      model.PasswordResetToken = passwordToken; 
      return View(model); 
     } 
    } 

筆者認爲:

@model Project.Models.PasswordReset 
@{ 
ViewBag.Title = "Password Reset"; 
} 

<h2>Password Reset</h2> 

<div class="form passwordreset-form"> 


@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    @Html.ValidationSummary() 

    <div class="input-form"> 

     <div class="inputbox-label"> 
      @Html.LabelFor(m => m.Password) 
     </div> 
     <div class="inputbox"> 
      @Html.PasswordFor(m => m.Password) 
     </div> 

     <div class="inputbox-label"> 
      @Html.LabelFor(m => m.ConfirmPassword) 
     </div> 
     <div class="inputbox"> 
      @Html.PasswordFor(m => m.ConfirmPassword) 
     </div> 

    </div> 
    <div style="float:right;"> 
     <input type="submit" value="Change Password" /> 
    </div> 

} 

</div> 

我的帖子控制器:

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult PasswordReset(PasswordReset model) 
    { 
     //Attemp to change password 
     var passwordChangeConfirmation = WebSecurity.ResetPassword(model.PasswordResetToken, model.Password); 

      //Password has been changed 
     if(passwordChangeConfirmation == true) 
     { 
      return RedirectToAction("Index", "Home"); 
     } 
      //Password change has failed 
     else 
     { 
      return RedirectToAction("Error", "Account"); 
     } 
    } 

回答

3

我最終調整了POST類以使其工作。

[HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult PasswordReset(PasswordReset model, string passwordToken) 
    { 
     //Attemp to change password 
     model.PasswordResetToken = passwordToken; 
     var passwordChangeConfirmation = WebSecurity.ResetPassword(model.PasswordResetToken, model.Password); 

     //Password has been changed 
     if (passwordChangeConfirmation == true) 
     { 
      return RedirectToAction("Index", "Home"); 
     } 
     //Password change has failed 
     else 
     { 
      return RedirectToAction("Error", "Account"); 
     } 
    } 
2

其添加到您的形式:

@Html.HiddenFor(m => m.PasswordResetToken); 
1

您可以在窗體上使用隱藏的輸入(從模型中)傳遞它。

@Html.HiddenFor(m => m.PasswordResetToken); 

在輸出

<input type="hidden" name="PasswordResetToken"></input>