目標:要允許任何管理員添加新用戶到ASP身份表,並指定他們在使用複選框列表中定義的角色。
型號:
public class RegisterViewModel
{
[Display(Name = "Name")]
public string FullName { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }
public List<RoleItem> Roles { get; set; }
}
public class RoleItem
{
public String Name { get; set; }
public String Id { get; set; }
public bool IsMember { get; set; }
}
控制器(GET):這讀取所有角色的數據庫,並將其轉變爲RoleItems的列表。這會在字段上加上字符「r」,因爲某些瀏覽器對於以數字開頭的id有問題。我們希望確保默認選中「用戶」組,因此我們在列表中找到該值並將IsMember屬性設置爲true。我們檢查,看看是否該頁面是從一個成功的POST重定向到這裏的要求(見下文)
// GET: /Account/AddUser
[Authorize(Roles = "Administrators")]
public ActionResult AddUser()
{
var rolesDb = new ApplicationDbContext(); //Users, Administrators, Developers, etc
ViewBag.AddSuccess = Request["added"]=="1" ? true : false;
var roleItems = rolesDb.Roles.Select(r => new RoleItem() { Id = "r" + r.Id, Name = r.Name, IsMember = false }).ToList(); //add an r to get around a browser bug
var users = roleItems.FirstOrDefault(r => r.Name == "Users"); //Get the row that has the Users value and set IsMember=true
if (users != null)
users.IsMember = true;
var m = new RegisterViewModel() {Roles = roleItems};
return View(m);
}
查看:漂亮的標準的東西。注意:@ Html.EditorFor(X => x.Roles)在底部,它使用一個編輯模板(如下)
@model cherry.Models.RegisterViewModel
@{
ViewBag.Title = "AddUser";
}
<h2>@ViewBag.Title.</h2>
@if (Convert.ToBoolean(ViewBag.AddSuccess))
{
<text>User added!</text>
}
@using (Html.BeginForm("AddUser", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>Create a new account.</h4>
<hr />
@Html.ValidationSummary()
<div class="form-group">
@Html.LabelFor(m => m.EmailAddress, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.EmailAddress, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.FullName, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.FullName, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.Password, new { value = Model.Password, @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.ConfirmPassword, new {@class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.PasswordFor(m => m.ConfirmPassword, new {value = Model.ConfirmPassword, @class = "form-control" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-default" value="Register" />
</div>
</div>
@Html.EditorFor(x => x.Roles)
}
EditorTemplate:
您MUST給模板相同的名稱作爲您爲其創建模板的對象。您還必須將此對象放在名爲EditorTemplates的文件夾下,您正在設計此視圖,或者可以將該文件夾放在共享文件夾中。
查看\帳戶\ EditorTemplates \ RoleItem.cshtml
@model cherry.Models.RoleItem
<div>
@Html.CheckBoxFor(x => x.IsMember)
@Html.LabelFor(x => x.IsMember, Model.Name)
@Html.HiddenFor(x => x.Name)
</div>
你應該有你的控制器 - >型號 - >查看<-Controller之間的通訊服務 – Mike