/ / MVC4 erreur liste déroulante - asp.net-mvc, asp.net-mvc-4, html.dropdownlistfor

Erreur de liste déroulante MVC4 - asp.net-mvc, asp.net-mvc-4, html.dropdownlistfor

Basé sur ce post Deuxième réponseJ'ai essayé de créer une liste déroulante pour ma page d'inscription. La page d'inscription comporte un champ dans lequel vous pouvez sélectionner PossibleAccessRight pour l'utilisateur lors de son enregistrement qui doit être enregistré dans AccessRight Attribut.

Pour le moment, je ne peux même pas afficher les éléments de la liste déroulante

Mon modèle ressemble à ceci

public class UserModel
{
public int UserId { get; set; }

[Required]
[EmailAddress]
[StringLength(100)]
[DataType(DataType.EmailAddress)]
[Display(Name = "Email ID ")]
public string Email { get; set; }

[Required]
[DataType(DataType.Password)]
[StringLength(20,MinimumLength = 6)]
[Display(Name = "Password ")]
public string Password { get; set; }

[Required]
[Display(Name = "First Name ")]
public string FirstName { get; set; }

[Required]
[Display(Name = "Last Name ")]
public string LastName { get; set; }

[Required]
[Display(Name = "Address ")]
public string Address { get; set; }

public List<string> PossibleRights;

[Required]
[Display(Name = "Access Rights")]
public string AccessRight { get; set; }

public UserModel()
{
PossibleRights = new List<string>()
{
{"High"},
{"Low"},
};
}
}

dans le contrôleur, je l'ai dans la méthode d'enregistrement qui est la méthode httppost

 [HttpGet]
public ActionResult Register()
{

return View();
}
[HttpPost]
public ActionResult Register(Models.UserModel user)
{
var rights = new UserModel();
if (ModelState.IsValid)
{
using (var db = new DBaseEntities())
{
var crypto = new SimpleCrypto.PBKDF2();

var encrpPass = crypto.Compute(user.Password);

var sysUser = db.SystemUsers.Create();

sysUser.FirstName = user.FirstName;
sysUser.Email = user.Email;
sysUser.Password = encrpPass;
sysUser.PasswordSalt = crypto.Salt;

db.SystemUsers.Add(sysUser);
db.SaveChanges();

return RedirectToAction("Index", "Home");

}
}
else
{
ModelState.AddModelError("","Login data is incorrect.");
}
return View(rights);
}

Afficher pour cette méthode ressemble à ceci

<div class="editor-label">@Html.LabelFor(u=> u.FirstName)</div>
<div class="editor-field"> @Html.TextBoxFor(u=> u.FirstName)</div>
<br/>
<div class="editor-label">@Html.LabelFor(u=> u.LastName)</div>
<div class="editor-field"> @Html.TextBoxFor(u=> u.LastName)</div>
<br/>
<div class="editor-label">@Html.LabelFor(u=> u.Address)</div>
<div class="editor-field"> @Html.TextBoxFor(u=> u.Address)</div>
<br/>
<div class="editor-label">@Html.LabelFor(u=> u.Email)</div>
<div class="editor-field"> @Html.TextBoxFor(u=> u.Email)</div>
<br/>
<div class="editor-label">@Html.LabelFor(u=> u.Password)</div>
<div class="editor-field"> @Html.PasswordFor(u=> u.Password)</div>
<br/>
<div class="editor-label">@Html.LabelFor(u=> u.AccessRight)</div>
<div class="editor-field"> @Html.DropDownListFor(u=> u.PossibleRights, new SelectList(Model.PossibleRights))</div>//error at this line(NullReference exception)

<br/>
<input type="submit" value="Register"/>

une idée de ce que je fais mal? De plus, mon approche pour afficher les éléments dans la liste déroulante est-elle bonne? Pouvez-vous suggérer une meilleure idée, le cas échéant?

Réponses:

0 pour la réponse № 1

Si vous souhaitez afficher des informations sur la vue, vous devez d'abord fournir ces informations à la vue. À l'heure actuelle, ce code:

public ActionResult Register()
{

return View();
}

ne fournit aucune information. Le modèle de la vue est créé avec le constructeur par défaut, ce qui signifie que l'objet de modèle est vide, donc rien ne s'affiche sur la vue (en particulier dans la liste déroulante). Ce dont vous avez besoin, c'est d'une initialisation comme celle-ci:

public ActionResult Register()
{
UserModel model = new UserModel();
model.PossibleRights = new List<string>{"Right1", "Right2", "Right3"};
// or go to db, or whatever

return View(model);
}

De plus, la liste déroulante renvoie la valeur sélectionnée lors de la publication, qui est une chaîne représentant un droit dans ce cas. Vous devez donc introduire un champ dans le modèle pour stocker la sélection:

public class UserModel
{
...
public List<string> PossibleRights;

public string SelectedRight;
...
}

L'utilisation en vue est la suivante:

@Html.DropDownListFor(u => u.SelectedRight, new SelectList(Model.PossibleRights))