2012-04-21 3 views
3

У меня есть админ-сайт для администратора для создания пользователей. Здесь он должен выбрать роли для пользователя - например, сайт конфигурации Asp.NET. Я сделал 3 флажка с разными ролями.Несколько ролей в Asp.net MVC3

[Authorize(Roles = "Admin")] 
    [HttpPost] 
    public ActionResult Register(RegisterModel model) 
    { 
     if (ModelState.IsValid) 
     { 

      var Rolemodel = model.RolesContainer; 
      // Attempt to register the user 
      MembershipCreateStatus createStatus; 
      Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus); 
      if (createStatus == MembershipCreateStatus.Success) 
      { 
       FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */); 
       return RedirectToAction("Index", "Home"); 
      } 
      else 
      { 
       ModelState.AddModelError("", ErrorCodeToString(createStatus)); 
      } 
     } 


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


    [Authorize(Roles = "Admin")] 
    public ActionResult Register() 
    { 
     List<SelectListItem> tempRoles = new List<SelectListItem>(); 
     tempRoles.Add(new SelectListItem{ Text = "Admin", Selected = false, Value = "Admin" }); 
      tempRoles.Add(new SelectListItem{ Text = "Production", Selected = false, Value = "Production"}); 
       tempRoles.Add(new SelectListItem{ Text = "Sale", Selected = false, Value = "Sale"}); 

       return View(new RegisterModel { RolesContainer = tempRoles }); 
    } 

---- Просмотр --------

@{ foreach (var item in Model.RolesContainer) 
       { 
        @Html.DisplayFor(m => item.Text) 
        @Html.CheckBoxFor(m => item.Selected) 
       } 
      } 

Когда я проверяю их и представить, я добираюсь до точки останова в моем Register действии, но RolesContainer равно нулю в этот момент - может ли кто-нибудь сказать мне, почему это так?

+0

Можете ли вы показать подпись своего метода httpost? Я думаю, вы можете ожидать параметр типа, отличный от модели, которую вы передаете в представление. – Nope

+0

Я обновил код сейчас, дело в том, когда я добраться до: если (ModelState.IsValid) { вар RoleModel = model.RolesContainer; } RolesContainer имеет значение null и не содержит выбранных значений – Mrlondon7100

ответ

0

В настоящее время, когда вы назначаете значение RolesContainer, оно не было инициализировано. Вам просто нужно инициализировать его в конструкторе класса:

public class RegisterModel 
{ 
    public RegisterModel() { 
     RolesContainer = new List<SelectListItem>; 
    } 

    // rest of your code 
} 

В качестве альтернативы вы можете создать конструктор, который принимает List<> в качестве параметра, но описанный выше метод будет работать для текущей структуры кода.

+0

Это не решит проблему. Когда CLR создает класс 'RegisterModel',' RolesContainer' будет null, тогда свойство будет установлено с помощью встроенного кода, чтобы присвоить 'RolesContainer' действительный' List '' tempRoles'. –

+0

Я обновил код в сообщении с точной проблемой в комментарии – Mrlondon7100

0

Если я хорошо понимаю (может быть, я совершенно неправ), модель, которую вы отправляете в регистр httppost (RegisterModel), не содержит ожидаемого вами RolesContainer. Я думаю, asp.net mvc не может сопоставлять несколько флажков с List<SelectListItem>, ListBox должен быть лучше

+0

обновил мой код в сообщении с точной проблемой, чтобы, может быть, дать лучшее понимание – Mrlondon7100

2

Я скопировал и вставил ваш код (за исключением cshtml) в следующие файлы, и он работает так, как ожидалось.

HomeController.cs

using System.Collections.Generic; 
using System.Web.Mvc; 
using MvcApplication1.Models; 

namespace MvcApplication1.Controllers 
{ 
    public class HomeController : Controller 
    { 
     // 
     // GET: /Home/ 

     public ActionResult Index() 
     { 
      List<SelectListItem> tempRoles = new List<SelectListItem>(); 
      tempRoles.Add(new SelectListItem { Text = "Admin", 
               Selected = false, 
               Value = "Admin" }); 
      tempRoles.Add(new SelectListItem { Text = "Production", 
               Selected = false, 
               Value = "Production" }); 
      tempRoles.Add(new SelectListItem { Text = "Sale", 
               Selected = false, 
               Value = "Sale" }); 

      return View(new RegisterModel { RolesContainer = tempRoles }); 
     } 

    } 
} 

RegisterModel

using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Web.Mvc; 

namespace MvcApplication1.Models 
{ 
    public class RegisterModel 
    { 
     [Required] 
     [Display(Name = "Brugernavn")] 
     public string UserName { get; set; } 

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

     public List<SelectListItem> RolesContainer { get; set;} 
    } 
} 

Главная/Index.cshtml

@model MvcApplication1.Models.RegisterModel 

@{ 
    foreach (var item in Model.RolesContainer) 
    { 
     @Html.DisplayFor(m => item.Text) 
     @Html.CheckBoxFor(m => item.Selected) 
    } 
} 

Mos Вероятно, в вашем файле Register.cshtml что-то не так, о чем нам не нужно проверять.

+0

как это работает? Можно ли назначить несколько ролей в идентификаторе aspnet? – kez

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