2011-01-05 37 views
3

我有一個角色顯示在複選框列表中的頁面,您可以選擇用戶想要的角色,然後單擊一個按鈕進行保存它。MVC:在複選框列表中顯示角色,然後保存它們

這裏是我的模型:

public class RegisterModel 
{ 
    [DisplayName("Roles")] 
    public string[] Roles 
    { 
     get 
     { 
      return System.Web.Security.Roles.GetAllRoles(); 
     } 
     set { } 
    } 
} 

我的觀點:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<WebUI.Models.RegisterModel>" %> 

<% using (Html.BeginForm()) { %> 
    <% foreach(string role in Model.Roles) { %> 
     <input type="checkbox" value="<%: role %>" /> <%: role %> 
    <% } %> 

    <p> 
     <input type="submit" value="Register" /> 
    </p> 
<% } %> 

而且從我的控制器的功能:

public ActionResult Register() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult Register(RegisterModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     //save roles 
     return RedirectToAction("Index", "Home"); 
    } 

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

當我嘗試查看我的網頁,我得到一個foreach語句中的「對象引用未設置爲對象的實例」錯誤,表示Model.Roles爲空。

  1. 我是否通過我的模型正確地傳遞角色?還是應該通過我的Controller動作將角色作爲ViewData傳遞?
  2. 如果我將角色作爲ViewData傳遞而不是通過我的模型傳遞,那麼當我提交表單時如何才能訪問所選項目,以便我可以調用Roles.AddUsersToRoles()

回答

3

首先,您沒有在獲取頁面時將模型傳遞給視圖。這導致空引用異常。它應該是:

[HttpGet] 
public ActionResult Register() { 

    //create an instance of your model however you are doing that 
    var model = new RegisterModel(); 

    //pass your model instance to your view 
    return View(model); 
} 

其次,你需要一個name屬性才能添加到您輸入的MVC模型綁定時的形式發佈到傳遞數據。

<% foreach(string role in Model.Roles) { %> 
    <input type="checkbox" name="Roles" value="<%: role %>" /> <%: role %> 
    <% } %> 

然而,隨着Roles屬性似乎沒有二傳手,你或許應該創建一個包含角色的視圖模型,使你的代碼應該是這樣的:

視圖模型

public class RegisterViewModel { 
    public string[] Roles { get; set; } 
    //...other properties 
} 

查看

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<WebUI.ViewModels.RegisterViewModel>" %> 

<% using (Html.BeginForm()) { %> 
    <% foreach(string role in Model.Roles) { %> 
    <input type="checkbox" name="Roles" value="<%: role %>" /> <%: role %> 
    <% } %> 

    <p><input type="submit" value="Register" /></p> 
<% } %> 

控制器

[HttpGet] 
public ViewResult Index() { 
    var model = new RegisterViewModel(); 
    model.Roles = System.Web.Security.Roles.GetAllRoles(); //or however you populate your roles 
    return View(model); 
} 

[HttpPost] 
public ActionResult Index(RegisterViewModel model) { 
    string[] roles = model.Roles //the selected roles are here 
    //.... 
} 
0

你可以這樣做(沒有這樣做的同時,所有從內存中):

<% foreach(string role in Model.Roles) { %> 
    <input type="checkbox" name="roles" value="<%: role %>" /> <%: role %> 
<% } %> 

而在你的控制器:

[HttpPost] 
public ActionResult Register(string[] roles) 
{ 
    if (ModelState.IsValid) 
    { 
     //save roles 
     return RedirectToAction("Index", "Home"); 
    } 

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

現在每個檢查複選框,你會在數組中獲得一個值。

0

這只是一個部分答案,但我可以解釋空引用異常位。

您還沒有創建RegisterModel類的實例。您的視圖期待WebUI.Models.RegisterModel,但您在此代碼中沒有提供。

嘗試之一:

public ActionResult Register() { return View(new RegisterModel()); }

或讓你的角色屬性靜態:

public static string[] Roles

並且在視圖的訪問是這樣的:

foreach(string role in RegisterModel.Roles)

0

可測性和理智,我會改變你的模型不伸手試圖抓住直接的作用,而是採取在構造函數中角色的列表。

相關問題