2013-05-27 4 views
0

Basé sur ce message Second answer J'ai essayé de créer une liste déroulante pour ma page de registre. La page Registre a un champ dans lequel vous pouvez sélectionner PossibleAccessRight pour l'utilisateur tout en l'enregistrant, ce qui devrait être sauvegardé dans l'attribut AccessRight.Erreur de liste déroulante MVC4

En ce moment je ne peux même pas montrer les éléments dropdownlist

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 i ont ceci en méthode registeration 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); 
     } 

Voir 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? Aussi, est-ce que mon approche pour montrer les articles dans la liste déroulante est bonne? Pouvez-vous suggérer une meilleure idée, le cas échéant?

+0

Pouvez-vous montrer la méthode d'action qui crée le modèle et le transmet en vue? – Andrei

+0

parlez-vous de l'action 'Register' avec l'attribut [HttpPost]' où je passe 'droits' à la vue? Sinon, je ne vous comprends pas vraiment. – Cybercop

+0

Je parlais de l'action 'Register' qui est déclenchée quand get request est envoyé. Vous l'avez déjà ajouté dans votre édition. – Andrei

Répondre

0

Si vous souhaitez afficher des informations sur la vue, vous devez d'abord fournir ces informations à la vue. Pour le moment, ce code:

public ActionResult Register() 
{ 

    return View(); 
} 

ne fournit aucune information. Le modèle pour la vue est créé avec le constructeur par défaut, ce qui signifie que l'objet du modèle est vide, donc rien n'est affiché sur la vue (en particulier dans la liste déroulante). Qu'est-ce que vous avez besoin est une initialisation comme ceci:

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

    return View(model); 
} 

En plus des rendements dropdown valeur sélectionnée lorsque affiché, ce qui est une chaîne représentant un droit dans ce cas. Vous avez donc besoin d'introduire un champ dans le modèle pour stocker la sélection:

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

    public string SelectedRight; 
    ... 
} 

Utilisation sur la vue est le suivant:

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

donc je dois passer les éléments dropdownlist de la méthode [httpget] plutôt que de la méthode [httpPost]? – Cybercop

+1

@ Biplov13, 'HttpGet' est la requête que vous recevez lorsque l'utilisateur entre dans la page (clique sur le lien, navigue vers l'URL). En réponse, vous devez afficher un formulaire avec tous les éléments, y compris les éléments pour le menu déroulant. 'HttpPost' d'autre part est la demande que vous recevez lorsque l'utilisateur entre tout sur le formulaire (y compris en choisissant l'option déroulante) et soumet le formulaire. Là, vous devez connaître la sélection - c'est ce que la propriété 'SelectedRight' ci-dessus pour. – Andrei

Questions connexes