2011-01-05 10 views
3

Ich habe eine Seite, auf der Rollen in einer Liste von Kontrollkästchen angezeigt werden, Sie können auswählen, welche Rollen ein Benutzer haben soll, und klicken Sie dann auf eine Schaltfläche zum Speichern es.MVC: Rollen in einer Liste von Kontrollkästchen anzeigen und dann speichern

Hier ist mein Modell:

public class RegisterModel 
{ 
    [DisplayName("Roles")] 
    public string[] Roles 
    { 
     get 
     { 
      return System.Web.Security.Roles.GetAllRoles(); 
     } 
     set { } 
    } 
} 

Meine Ansicht:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<WebUI.Models.RegisterModel>" %> 

<% using (Html.BeginForm()) { %> 
    <% foreach(string role in Model.Roles) { %> 
     <input type="checkbox" value="<%: role %>" /> <%: role %> 
    <% } %> 

    <p> 
     <input type="submit" value="Register" /> 
    </p> 
<% } %> 

Und die Funktionen von meinem Controller:

public ActionResult Register() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult Register(RegisterModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     //save roles 
     return RedirectToAction("Index", "Home"); 
    } 

    // If we got this far, something failed, redisplay form 
    return View(model); 
} 

Wenn ich versuche, meine Seite zu sehen, erhalte ich eine "Objektreferenz nicht auf eine Instanz eines Objekts gesetzt" -Fehler in der foreach-Anweisung, was darauf hinweist, dass Model.Roles leer ist.

  1. Übergeben die Rollen korrekt durch mein Modell? Oder sollte ich die Rollen als ViewData durch meine Controller-Aktion weitergeben?
  2. Wenn ich die Rollen als ViewData statt über mein Modell übergebe, wie kann ich auf die ausgewählten Elemente zugreifen, wenn ich das Formular absende, sodass ich Roles.AddUsersToRoles() anrufen kann?

Antwort

3

Als Erstes übergeben Sie Ihr Modell nicht an die Ansicht, wenn Sie die Seite erhalten. Dies verursacht die Null-Referenz-Ausnahme. Es sollte sein:

[HttpGet] 
public ActionResult Register() { 

    //create an instance of your model however you are doing that 
    var model = new RegisterModel(); 

    //pass your model instance to your view 
    return View(model); 
} 

Zweitens benötigen Sie ein name Attribut auf Ihre Eingaben, um für das MVC-Modell hinzufügen Binden der Daten zu übergeben, wenn das Formular gebucht wird.

<% foreach(string role in Model.Roles) { %> 
    <input type="checkbox" name="Roles" value="<%: role %>" /> <%: role %> 
    <% } %> 

jedoch als Roles Eigenschaft keine Setter zu haben scheint wahrscheinlich sollten Sie einen Blick Modell erstellen, um die Rollen enthalten, so dass Ihr Code sollte wie folgt aussehen:

Ansicht Modell

public class RegisterViewModel { 
    public string[] Roles { get; set; } 
    //...other properties 
} 

anzeigen

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<WebUI.ViewModels.RegisterViewModel>" %> 

<% using (Html.BeginForm()) { %> 
    <% foreach(string role in Model.Roles) { %> 
    <input type="checkbox" name="Roles" value="<%: role %>" /> <%: role %> 
    <% } %> 

    <p><input type="submit" value="Register" /></p> 
<% } %> 

Steuerung

0

Sie können (dies eine Zeit lang nicht getan haben, die alle aus dem Gedächtnis) so etwas wie tun:

<% foreach(string role in Model.Roles) { %> 
    <input type="checkbox" name="roles" value="<%: role %>" /> <%: role %> 
<% } %> 

Und in Ihrem Controller:

[HttpPost] 
public ActionResult Register(string[] roles) 
{ 
    if (ModelState.IsValid) 
    { 
     //save roles 
     return RedirectToAction("Index", "Home"); 
    } 

    // If we got this far, something failed, redisplay form 
    return View(model); 
} 

Und nun für jeden überprüft Kontrollkästchen erhalten Sie einen Wert im Array.

0

Dies ist nur eine Teilantwort, aber ich kann das Null-Referenz-Ausnahme-Bit erklären.

Sie haben keine Instanz Ihrer RegisterModel-Klasse erstellt. Ihre Ansicht erwartet ein WebUI.Models.RegisterModel, das Sie jedoch nicht in diesem Code angegeben haben.

Versuchen entweder:

public ActionResult Register() { return View(new RegisterModel()); }

oder Ihre Rollen Eigenschaft statisch machen:

public static string[] Roles

und den Zugang Ihrer Ansicht nach auf diese Weise:

foreach(string role in RegisterModel.Roles)

0

Für Testbarkeit und Vernunft würde ich Ihr Modell ändern, um nicht zu greifen und die Rollen direkt zu greifen, sondern eine Liste von Rollen im Konstruktor zu nehmen.

Verwandte Themen