2017-08-23 2 views
0

Ich bin sehr neu in ASP.NET, aber ich habe einen FirstName (Zeichenfolge), LastName (Zeichenfolge) und AccountType (Int, die eine 0, 1 sein kann, oder 2) zu meiner AspNetUsers Datenbank. Ich arbeite in MVC 5. Während ich zahlreiche Artikel über das Ändern des Passworts gefunden habe, möchte ich jedoch die Möglichkeit hinzufügen, dass Benutzer AccountType ändern können.Wie ändere ich benutzerdefinierte Spalten in AspNetUsers Tabelle

Ich bin mir bewusst, dass die Rollen in diesem Fall eine bessere Option gewesen sein könnten, aber ich habe schon so viel implementiert, dass ich das jetzt lieber nicht ändern würde.

Das Formular für die Änderung des Kontotyps enthält ein Feld für den Benutzer zur Eingabe seines Passworts (um zu bestätigen, dass der Kontotyp geändert werden soll) und eine Dropdown-Liste mit drei Optionen, deren Wert 0, 1, oder 2.

kurz gesagt, wird der Benutzer sein Passwort eingeben, klicken Sie auf eine Option im Dropdownlist, dann klicken Sie auf „sumbit Button“ und Account wird zu einem anderen 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> 

geändert werden
@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> 
} 

Und hier ist ein Teil von 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; } 
} 

Also, wahrscheinlich in ManageController.cs, was soll ich hinzufügen, die Informationen aus dem ersten Teil der Form zu ermöglichen, überprüfen Sie das Passwort des Benutzers und was sollte ich der gleichen Datei hinzufügen, damit (wenn die Passwörter übereinstimmen) die AccountType-Datenbank mit der Wahl des Benutzers aktualisiert wird?

(eine bearbeitete Kopie der Funktion "Kennwort ändern" hat nicht funktioniert)

UPDATE ich das ManageController.cs hinzugefügt:

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

Aber es funktioniert nur einmal. Ich führe einen Test davon aus, ich ändere den Kontotyp des Benutzers und speichert es in der AspNetUsers db. Wenn ich es jedoch erneut ausführe, kann ich es in ANY-Benutzerkonten nicht mehr ändern. Was muss ich tun, um dies jedes Mal zum Laufen zu bringen, wenn der Benutzer die Dropdown-Liste ändert und auf die Schaltfläche "Senden" klickt?

Antwort

0

ich beschlossen, nur den Benutzer abmelden und haben sie sich anmelden zurück.

[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); 

    } 
Verwandte Themen