2012-04-21 10 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 }); 
    } 

---- 내가 그들을 확인하고 제출하면보기 내 Register 행동에 브레이크 포인트에 도착,

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

를 --------하지만 RolesContainer은 널 이 점 - 왜이 사람이 내게 말할 수 있습니까?

+0

httpost 메소드의 서명을 표시 할 수 있습니까? 뷰에 전달할 모델과 다른 유형의 매개 변수가 필요할 것으로 생각됩니다. – Nope

+0

코드를 지금 업데이트했습니다. 요점은 다음과 같습니다. if (ModelState.IsValid) { var 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'에'tempRoles'의 유효한'List '을 할당 할 것입니다. –

+0

의견에서 정확한 문제가있는 게시물에서 내 코드가 업데이트되었습니다 – Mrlondon7100

0

잘 이해하면 (내가 완전히 틀릴 수도 있음) httppost register (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) 
    } 
} 

모스 우리가 검증 할 필요가없는 Register.cshtml 파일에 잘못된 것이있을 가능성이 있습니다.

+0

이 게시물 작업의 작동 방식은 무엇입니까? aspnet ID에 여러 역할을 지정할 수 있습니까? – kez