2017-08-23 5 views
0

Je suis très nouveau sur ASP.NET, mais j'ai ajouté un FirstName (chaîne), LastName (chaîne), et AccountType (int, qui peut être un 0, 1, ou 2) à ma base de données AspNetUsers. Je travaille dans MVC 5. Alors que j'ai trouvé de nombreux articles sur la modification du mot de passe, mais je voudrais ajouter la possibilité de laisser les utilisateurs changer AccountType.Comment changer les colonnes personnalisées dans la table AspNetUsers

Je suis conscient que les rôles auraient pu être une meilleure option dans ce cas, mais j'ai déjà tellement implémenté que je préfèrerais ne pas changer cela maintenant. Le formulaire pour le changement de type de compte contient un champ pour l'utilisateur d'entrer son mot de passe (pour confirmer qu'ils aimeraient que le type de compte a changé, et une liste déroulante donnant trois options dont la valeur est 0, 1, ou 2.

En bref, l'utilisateur son mot de passe, cliquez sur une option sur la dropdownlist, puis cliquez sur le bouton « SUMBIT » et AccountType sera changé à un autre int

@using SouthMeckNTHS.Models 
@using SouthMeckNTHS.Extensions 
@model ChangeAccountViewModel 
@{ 
    ViewBag.Title = "Change Account Type"; 
} 

<section class="engine"></section> 
<section class="mbr-section article mbr-parallax-background mbr-after-navbar" id="msg-box8-7d" style="background-image: url(../assets/images/full-unsplash-photo-1438354886727-070458b3b5cf-2000x1553-39.jpg); padding-top: 120px; padding-bottom: 80px;"> 
<div class="mbr-overlay" style="opacity: 0.5; background-color: rgb(34, 34, 34);"> 
</div> 
<div class="container"> 
    <div class="row"> 
     <div class="col-md-8 col-md-offset-2 text-xs-center"> 
      <h3 class="mbr-section-title display-2">MANAGE YOUR ACCOUNT</h3> 
      <div class="lead"><p>Change your account settings</p></div> 
     </div> 
    </div> 
</div> 

@using (Html.BeginForm("AccountChange", "Manage", FormMethod.Post, new { 
@class = "form-horizontal", role = "form" })) 
{ 
    Html.AntiForgeryToken(); 

<div class="mbr-section mbr-section__container mbr-section__container--middle"> 
    <div class="container"> 
     <div class="row"> 
      <div class="col-xs-12 text-xs-center"> 


      </div> 
     </div> 
    </div> 
</div> 
<div class="mbr-section mbr-section-nopadding"> 
    <div class="container"> 
     <div class="row"> 
      @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
      <div class="col-xs-12 col-lg-10 col-lg-offset-1"> 
       <div class="row row-sm-offset"> 
        <div class="col-xs-12 col-md-12"> 
         <div class="form-group"> 
          <label class="form-control-label" for="form1-z-name">Enter your current email<span class="form-asterisk">*</span></label> 
          @Html.TextBoxFor(m => m.CurrentPassword, new { @class = "form-control" }) 
          @Html.ValidationMessageFor(m => m.CurrentPassword, "", new { @class = "text-danger", @style = "color:white" }) 
          <!--<input type="text" class="form-control" name="name" required="" data-form-field="Name" id="form1-z-name">--> 
         </div> 
        </div> 
        <div class="col-xs-12 col-md-12"> 
         <div class="form-group"> 
          <label class="form-control-label" for="form1-z-name">Choose Your Account Type<span class="form-asterisk">*</span></label> 
          @Html.DropDownListFor(
m => m.NewAccountType, 
new SelectList(
new List<Object> 
{ 
                 new { value = 0 , text 
= "Learner" }, 
                 new { value = 1 , text 
= "Contributor" }, 
                 new { value = 2 , text 
= "Competitor"} 
}, 
"value", 
"text" 
), new { @style = "border: 1px solid #e8e8e8;padding: 0.5em 1.07em 0.5em;background: #f5f5f5;font-size: 0.875rem;border-radius: 5px;width: 100%;line-height: 1.43;min-height: 3.5em;" } 
) 
         </div> 
        </div> 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
</section> 
<section class="mbr-section mbr-section__container" id="buttons1-r" style="background-color: rgb(255, 255, 255); padding-top: 10px; padding-bottom: 5px;"> 
<div class="container"> 
    <div class="row"> 
     <div class="col-xs-12"> 
      <div class="text-xs-center"><input type="submit" class="btn btn-primary text-xs-center" value="CHANGE ACCOUNT TYPE" /> </div> 
     </div> 
    </div> 
</div> 
</section> 
} 

Et voici une partie de ManageViewModels.cs:

public class ChangeAccountViewModel 
{ 

    [Required] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string CurrentPassword { get; set; } 

    [Required] 
    [Display(Name = "Choose Account Type")] 
    public int NewAccountType { get; set; } 
} 

Ainsi, vraisemblablement ManageController.cs, que dois-je ajouter pour permettre l'information de la première partie du formulaire vérifier par rapport au mot de passe de l'utilisateur et que dois-je ajouter au même fichier afin que (si les mots de passe correspondent) il mettra à jour la base de données AccountType avec le choix de l'utilisateur?

(une copie modifiée du "changer le mot" fonction n'a pas fonctionné)

MISE À JOUR J'ajouté à ManageController.cs:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> AccountChange(ChangeAccountViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      // Get the current application user 
      var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 


      //Update the details 
      user.AccountType = model.NewAccountType; 


      // Update user address 
      var result = await UserManager.UpdateAsync(user); 




     } 

     return View(model); 
    } 

Mais il fonctionne qu'une seule fois. J'en fais un test, je change le type de compte de l'utilisateur, et il enregistre sur la base de données AspNetUsers. Cependant, quand je l'exécute à nouveau, je ne peux plus le changer dans N'IMPORTE QUEL compte d'utilisateur. Que dois-je faire pour que cela fonctionne à chaque fois que l'utilisateur modifie la liste déroulante et clique sur le bouton Soumettre?

Répondre

0

j'ai décidé de vous connecter simplement l'utilisateur sur et demandez-leur reconnexion.

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> AccountChange(ChangeAccountViewModel model) 
    { 
     //THE THING THAT ONLY WORKED ONCE: 
     if (ModelState.IsValid) 
     { 
      // Get the current application user 
      var user = await UserManager.FindByIdAsync(User.Identity.GetUserId()); 


      //Update the details 
      user.AccountType = model.NewAccountType; 


      // Update user account type 
      var result = await UserManager.UpdateAsync(user); 

      if (result.Succeeded) 
      { 
       AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 
       return RedirectToAction("../Account/Login"); 
      } 
     } 
     return View(model); 

    }