Зачем Html.DropDownListFor нужен элемент данных представления? - PullRequest
1 голос
/ 29 февраля 2012

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

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

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);
    }

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 29 февраля 2012

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

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


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

...