2017-02-14 1 views
0

Ich habe einen People-Controller für die Benutzerverwaltung und ich versuche herauszufinden, wie die Dropdown-Auswahl zu erhalten, wenn der Benutzer von der Bearbeitungsseite übermittelt. Immer wenn ich auf der Seite auf "Senden" klicke, scheint keiner der Werte aus dem Ansichtsmodell auf den Post zu übertragen. Ich kann den Wert, den sie ausgewählt haben, nicht aus dem Drop-down-Menü abrufen, um die Rolle festzulegen.Abgegebene Daten aus Dropdown im Ansichtsmodell abrufen?

See Ansicht Modell unten:

public class PersonViewModel 
{ 
    public int PersonId { get; set; } 
    [Display(Name = "Full Name")] 
    public string FullName { get; set; } 
    public string Email { get; set; } 
    [Display(Name = "Current Role")] 
    public string SetRole { get; set; } 
    public List<RoleListViewModel> Roles { get; set; } 
} 

Siehe Controller Editierfunktionen unter:

// GET: People/Edit/5 
    public ActionResult Edit(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Person person = db.people.Find(id); 
     if (person == null) 
     { 
      return HttpNotFound(); 
     } 
     PersonViewModel pvm = new PersonViewModel(); 
     List<IdentityRole> roles = adb.Roles.ToList(); 
     var rlvm = new List<RoleListViewModel>(); 
     roles.ForEach(x => rlvm.Add(new RoleListViewModel { RoleId = x.Id, RoleName = x.Name })); 
     pvm.PersonId = person.PersonId; 
     pvm.FullName = person.FirstName + " " + person.LastName; 
     pvm.Email = person.Email; 
     pvm.Roles = rlvm; 
     ViewBag.RoleList = new SelectList(rlvm, "RoleName", "RoleName", person.CurrentRole); 

     return View(pvm); 
    } 

    // POST: People/Edit/5 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit(PersonViewModel pvm) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(pvm).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     var usr = new AccountController(); 
     var pers = db.people.Where(x => x.PersonId == pvm.PersonId).FirstOrDefault(); 
     usr.UserManager.AddToRoleAsync(pers.NetId, /* their choice should go here but how? */); 
     db.SaveChanges(); 


     return View(pvm); 
    } 

Hier ist die cshtml:

<div class="form-group"> 
     @Html.LabelFor(model => model.Roles, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="form-control-static"> 
      @Html.DropDownList("RoleList", null, new { @class = "form-control" }) 
      @Html.ValidationMessageFor(model => model.Roles, "", new { @class = "text-danger" }) 
     </div> 
    </div> 
+0

Ihre Bindung an eine Eigenschaft mit dem Namen 'RoleList', die in Ihrem Modell nicht vorhanden ist. Ich nehme an, du willst '@ Html.DropDownListFor (m => m.SetRole, (SelectList) ViewBag.RoleList)' Und dann musst du den letzten Parameter im 'SelectList'-Konstruktor löschen (wenn du dann eine Option haben willst) Sie müssen den Wert von 'SetRole' einstellen. Und Ihre Label- und Validierungsnachricht sollte für "SetRole" und nicht für "Roles" bindend sein. Und da Sie ein View-Modell haben, sollte 'Roles' typeof' Enumerable 'sein und' ViewBag' loswerden. –

+0

Ich schlage vor, Sie studieren den Code [hier] (http://stackoverflow.com/questions/34366305/the-viewdata-item-that-has-the-key-xxx-is-of-type-system-int32- aber -must-be-o) –

Antwort

1

eine Variable in Ihrem View Modell Make zu speichern den ausgewählten Wert und dann in der Ansicht

verwenden
@Html.DropDownListFor(m => m.SelectedRoleVariable, RolesSelectList, new { @class = "form-control" }); 
+0

Er könnte einfach die Variable SetRole verwenden, da er wahrscheinlich die aktuelle Rolle setzt – Fran

+0

Woher kommt diese RolesSelectList? Ich nehme an, es ist eine Auswahlliste, aber ich habe meine in der Steuerung erstellt und zugewiesen ViewBag.RoleList –

+0

Ich habe eine neue Auswahlliste in der cshtml mit model.rlvm erstellt, aber wenn ich auf "Senden", aus irgendeinem Grund die pvm.Email -Eigenschaft ist null. Warum? Ich debugge und ich kann person.Email sehen, so macht es keinen Sinn, dass es null wäre. –