2012-04-21 15 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がでnullでありますこの点 - 誰が私にこの理由が分かりますか?

+0

httpostメソッドの署名を表示できますか?私はあなたがビューに渡すモデルとは異なる型のパラメータを期待していると思います。 – Nope

+0

私は私がに取得するときのポイントは、今のコードを更新: { するvar Rolemodel = model.RolesContainer(ModelState.IsValid)場合 。 } RolesContainerがnullで、選択した値が含まれていません – Mrlondon7100

答えて

0

現在、値をRolesContainerに割り当てると、初期化されていません。

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

    // rest of your code 
} 

はまた、あなたがパラメータとしてList<>を受け取るコンストラクタを作成することができますが、上記の方法は、あなたの現在のコードの構造のために動作します:あなたは、単にあなたのクラスのコンストラクタで、それを初期化する必要があります。

+0

これで問題は解決しません。 CLRが 'RegisterModel'クラスを作成するとき、' RolesContainer'はヌルになります、 '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

関連する問題