2012-02-29 7 views
1

利用可能なすべてのユーザーロールのドロップダウンリストを含めるために、ボイラープレートのアカウント登録ビューを変更しようとしました。現在、リストは適切に表示されますが、新しいユーザーを登録しようとすると、モデルの状態は無効になります。ここでなぜHtml.DropDownListForはビューデータ項目を必要としますか?

がモデルの関連部分である:

public class RegisterModel 
    { 
     [Required] 
     [Display(Name = "User name")] 
     public string UserName { get; set; } 


     [Display(Name = "Role")] 
     public SelectListItem Role { get; set; } 

     [Required] 
     [Display(Name = "Roles")] 
     public List<SelectListItem> Roles { get; set; } 

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

...ここ

は、コントローラの関連する部分である:

[HttpGet] 
     public ActionResult Register() 
     { 
      RegisterModel initmodel = new RegisterModel(); 

      initmodel.Roles = new List<SelectListItem>(); 

      foreach (string role in Roles.GetAllRoles()) 
      { 
       SelectListItem item = new SelectListItem(); 

       item.Text = role; 
       item.Value = role; 
       initmodel.Roles.Add(item); 

      } 

      return View(initmodel); 
     } 


     // POST: /Account/Register 





[Authorize(Roles = "TelesageAdmin")] 
    [HttpPost] 
    public ActionResult Register(RegisterModel model) 
    { 
     SQWDataContext db = new SQWDataContext(); 



     model.Roles = new List<SelectListItem>(); 

     foreach (string role in Roles.GetAllRoles()) 
     { 
      SelectListItem item = new SelectListItem(); 

      item.Text = role; 
      item.Value = role; 
      model.Roles.Add(item); 

     } 

     if (ModelState.IsValid) 
     { 
      // Attempt to register the user 
      MembershipCreateStatus createStatus; 
      Membership.CreateUser(model.UserName, model.Password, model.Email, "question", "answer", true, null, out createStatus); 



      if (createStatus == MembershipCreateStatus.Success) 
      { 
       Roles.AddUserToRole(model.UserName, model.Role.Text); 
       FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */); 

       UserProfile newuser = new UserProfile(); 
       newuser.UserName = model.UserName; 
       newuser.canEdit = true; 
       newuser.Role = model.Role.Text; 

       db.UserProfiles.InsertOnSubmit(newuser); 

       return RedirectToAction("Index", "Home"); 
      } 
      else 
      { 
       ModelState.AddModelError("", ErrorCodeToString(createStatus)); 
      } 
     } 

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

任意の助けいただければ幸いです!

+0

でオブジェクトを再構築する必要がありますか? –

+0

'Roles.GetAllRoles()'がnullまたは空のリストを返さないことを確認できますか? 'null'の場合、' HtmlHelper'は 'ViewData'を参照して' DropDownList'を埋め込みます。 – Joe

+0

@JoeTuskan、ドロップダウンにはすべてのロールが設定されているためnullを返しません。私は問題があると提出するときだけです。 – Scottingham

答えて

1

モデルのRoleプロパティは、SelectListItemではなく文字列である必要があります。

フォームを投稿すると、選択したドロップダウンアイテムの値が「ロール」という名前の下に転記されます。モデルバインダーはSelectListItemに文字列を強制することはできませんので、あきらめるだけでエラーになります。


また、あなたは役割が[HttpPost]アクションあなたのビューから継承しないどのようなクラス

+0

これはエラーを示しています。キー 'Role'を持つViewDataアイテムは 'System.String'タイプですが、 'IEnumerable 'タイプである必要があります。 – Scottingham

+0

Hmm。それは通常私のために働く、私は一瞬の周りを突きつけてみましょう。 –

+0

あなたはその行をどのような行にしますか? –

関連する問題