比如,当为一个用户设置角色的时候,角色通常以CheckBoxList的形式呈现。用户和角色是多对多关系:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; namespace MvcApplication2.Models
{
public class User
{
public int Id { get; set; } [Display(Name = "用户名")]
public string Name { get; set; } public IList<Role> Roles { get; set; }
}
} using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; namespace MvcApplication2.Models
{
public class Role
{
public int Id { get; set; } [Display(Name = "角色名")]
public string Name { get; set; } public IList<User> Users { get; set; }
}
}

在界面中包括:用户的信息,所有角色,当前选中角色的Id。所以,与为用户设置角色界面对应的View Model大致这样:

using System.Collections.Generic;

namespace MvcApplication2.Models
{
public class UserVm
{
public User User { get; set; }
public List<Role> AllRoles { get; set; }
public List<Role> UserRoles { get; set; }
public int[] SelectedRoleIds { get; set; }
}
}

HomeController中:

using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using MvcApplication2.Models; namespace MvcApplication2.Controllers
{
public class HomeController : Controller
{
/// <summary>
/// 为用户设置初始角色Id
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
UserVm userVm = new UserVm();
userVm.User = new User() {Id = 1, Name = "Darren"};
userVm.AllRoles = GetAllRoles();
userVm.SelectedRoleIds = new []{1, 4}; List<Role> currentUserRoles = new List<Role>();
foreach (var item in userVm.SelectedRoleIds)
{
var temp = GetAllRoles().Where(u => u.Id == item).FirstOrDefault();
currentUserRoles.Add(temp);
}
userVm.UserRoles = currentUserRoles;
return View(userVm);
} /// <summary>
/// 根据前端视图选择的角色Id,给UserVm的UserRoles属性重新赋值
/// </summary>
/// <param name="userVm"></param>
/// <returns></returns>
[HttpPost]
public ActionResult Index(UserVm userVm)
{
userVm.AllRoles = GetAllRoles(); List<Role> newUserRoles = new List<Role>();
foreach (var item in userVm.SelectedRoleIds)
{
var temp = GetAllRoles().Where(u => u.Id == item).FirstOrDefault();
newUserRoles.Add(temp);
}
userVm.UserRoles = newUserRoles;
return View(userVm);
} //获取所有的角色
private List<Role> GetAllRoles()
{
return new List<Role>()
{
new Role(){Id = 1, Name = "管理员"},
new Role(){Id = 2, Name = "库管员"},
new Role(){Id = 3, Name = "财务主管"},
new Role(){Id = 4, Name = "销售主管"},
new Role(){Id = 5, Name = "人力主管"}
};
}
}
}

方法一:通过在视图页编码的方式

@using MvcCheckBoxList.Model
@model MvcApplication2.Models.UserVm @{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
} @using (Html.BeginForm())
{
@Html.HiddenFor(m => m.User.Id) <br/>
@Html.LabelFor(m => m.User.Name)
@Html.EditorFor(m => m.User.Name)
@Html.ValidationMessageFor(m => m.User.Name)
<br/>
<ul style="list-style:none;">
@foreach (var a in Model.AllRoles)
{
<li>
@if (Model.SelectedRoleIds.Contains(a.Id))
{
<input type="checkbox" name="SelectedRoleIds" value="@a.Id" id="@a.Id" checked="checked"/>
<label for="@a.Id">@a.Name</label>
}
else
{
<input type="checkbox" name="SelectedRoleIds" value="@a.Id" id="@a.Id" />
<label for="@a.Id">@a.Name</label>
}
</li>
}
</ul>
<br/>
<input type="submit" value="为用户设置角色"/>
} @section scripts
{
@Scripts.Render("~/bundles/jqueryval")
}

效果如图:

方法二:通过NuGet的MvcCheckBoxList扩展

→工具--库程序包管理器--程序包管理器控制台
→install-package MvcCheckBoxList

@using MvcCheckBoxList.Model
@model MvcApplication2.Models.UserVm @{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
} @using (Html.BeginForm())
{
@Html.HiddenFor(m => m.User.Id) <br/>
@Html.LabelFor(m => m.User.Name)
@Html.EditorFor(m => m.User.Name)
@Html.ValidationMessageFor(m => m.User.Name)
<br/>
@Html.CheckBoxListFor(m => m.SelectedRoleIds,
m => m.AllRoles, //所有角色
r => r.Id, //value值
r => r.Name, //显示值
r => r.UserRoles, //用户当前角色
Position.Horizontal //CheckboxList排列方向
)
<br/>
<input type="submit" value="为用户设置角色"/>
} @section scripts
{
@Scripts.Render("~/bundles/jqueryval")
}

效果如图:

方法三:通过自定义扩展方法

MVC扩展生成CheckBoxList并水平排列

MVC生成CheckBoxList并对其验证

MVC中CheckBoxList的3种实现方式的更多相关文章

  1. ASP.NET MVC 表单的几种提交方式

    下面是总结一下在ASP.NET MVC中表单的几种提交方式. 1.Ajax提交表单 需要引用 <script type="text/javascript" src=" ...

  2. spring 整合 mybatis 中数据源的几种配置方式

    因为spring 整合mybatis的过程中, 有好几种整合方式,尤其是数据源那块,经常看到不一样的配置方式,总感觉有点乱,所以今天有空总结下. 一.采用org.mybatis.spring.mapp ...

  3. Django中提供的6种缓存方式

    由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用: 缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...

  4. 【温故知新】——原生js中常用的四种循环方式

    一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0   网页输出“欢迎下次光临” 在网页中弹出框输入1   网页输出“查询中……” 在 ...

  5. Springboot中IDE支持两种打包方式,即jar包和war包

    Springboot中IDE支持两种打包方式,即jar包和war包 打包之前修改pom.xml中的packaging节点,改为jar或者war    在项目的根目录执行maven 命令clean pa ...

  6. JAVA高级架构师基础功:Spring中AOP的两种代理方式:动态代理和CGLIB详解

    在spring框架中使用了两种代理方式: 1.JDK自带的动态代理. 2.Spring框架自己提供的CGLIB的方式. 这两种也是Spring框架核心AOP的基础. 在详细讲解上述提到的动态代理和CG ...

  7. Vue中常用的几种传值方式

    Vue中常用的几种传值方式 1. 父传子 父传子的实现方式就是通过props属性,子组件通过props属性接收从父组件传过来的值,而父组件传值的时候使用 v-bind 将子组件中预留的变量名绑定为da ...

  8. MVC中处理表单提交的方式(Ajax+Jquery)

    MVC中处理表单有很多种方法,这里说到第一种方式:Ajax+Jquery 先看下表单: <form class="row form-body form-horizontal m-t&q ...

  9. MVC中实现Area几种方法

    概述        ASP.NET MVC中,是依靠某些文件夹以及类的固定命名规则去组织model实体层,views视图层和控制层的.如果是大规模的应用程序,经常会由不同功能的模块组成,而每个功能模块 ...

随机推荐

  1. CVE-2009-3459

     Adobe Acrobat和Reader都是美国Adobe公司开发的非常流行的PDF文件阅读器.         Adobe Reader和Acrobat 7.1.4之前的7.x版本,8.1.7之前 ...

  2. MIT6.006Lec02:DocumentDistance

    MIT6.006是算法导论,Lec02讲的是Document Distance(文档距离),比如比较两个文档相似度或者搜索引擎中都会用到. 计算步骤为: 1.将每个文档分离为单词 2.统计词频 3.计 ...

  3. 使用VSCode配置简单的vue项目

    由于最近要使用的项目框架为前后端分离的,采用的是vue.js+webAPI的形式进行开发的.因为之前我没有接触过vue.js,也只是通过视频文档做了一些简单的练习.今天技术主管说让大家熟悉下VSCod ...

  4. 使用linux mysql客户端建立表时遇到格式解析的问题

    发现在notepad++写好的建表脚本,粘贴到linux客户端后,执行时总是报我的脚本有问题. 我看了又看,发现建表脚本本身是没有问题,问题出在"Tab"键上和注释上边了. 解决办 ...

  5. 本机ip和127.0.0.1的区别

    简介 连接上因特网的每一台计算机都会有一个IP地址, 在linux下可以使用命令ifconfig来查看本机的ip地址(windows为ipconfig), 比如我当前电脑的ip地址为192.168.0 ...

  6. java 里的内部类

    java里的内部类通常能帮我们隐藏一些具体实现,体现良好的封装效果. 内部类又分几种: 1.普通内部类 2.局部内部类 3.匿名内部类 4.静态内部类 普通内部类 先来看第一种普通的内部类,这种内部类 ...

  7. MYSQL插入不能中文的问题的解决

    这个问题是由于数据库的字符集不对的问题. 解决方法: 打开要用的数据库,输入命令 status 如果Client characterset 值为utf8,则要改为:set char set 'gbk' ...

  8. SQL注入备忘录

    备忘录(一) 拿起小本本记下常考知识点. 常用连接词 and && %23%23 且 or || %7c%7c 或 xor 非 Access 数据库: 只能爆破表名.列名获取数据.无法 ...

  9. 解决mongo 端口占用问题

    在打开mongod之后如果不用了就按ctrl + c ,就不会出现以下的问题了 执行mongod报错 mongod 2016-08-03T14:31:15.691+0800 I CONTROL [in ...

  10. #pragma region、{}

    定义一个region,这个region内部的代码你可以把它折叠起来是用于组织代码的,没有其他特别重要的意义. 而{}定义了作用域 { int a = 0; } { int a = 0; }