2012-02-29 1 views
1

Я попытался изменить представление учетной записи счетчика, чтобы включить раскрывающийся список всех доступных пользовательских ролей. В настоящее время список будет отображаться правильно, но когда я попытаюсь зарегистрировать нового пользователя, состояние модели будет недействительным.Почему Html.DropDownListFor нужен элемент viewdata?

Вот соответствующая часть модели:

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», то «HtmlHelper» будет выглядеть «ViewData», чтобы заполнить «DropDownList» – Joe

+0

@JoeTuskan, он не возвращает null, потому что выпадающее меню заполнено всеми ролями. Только когда я утверждаю, что есть проблема. – Scottingham

ответ

1

Свойство Role на вашей модели должно быть строкой, а не элементом SelectListItem.

Когда вы публикуете свою форму, он будет публиковать только значение выделенного выпадающего элемента под именем «Роль». Модельное связующее не может принудительно вставить строку в SelectListItem, чтобы она просто сдавалась, и вы попали в вашу ошибку.


Также вам необходимо восстановить роли объект в [HttpPost] действиях

+0

Это дает ошибку: элемент ViewData, имеющий ключ «Роль», имеет тип «System.String», но должен иметь тип «IEnumerable ». – Scottingham

+0

Хм. Это, как правило, работает для меня, дайте мне порыться на мгновение. –

+0

В какой строке вы получаете это исключение? –

Смежные вопросы