ASP.NET MVC 3 CheckBoxList 的使用
在以前的 ASP.NET MVC 中可以直接使用 CheckBoxList,但后来不知道什么原因在 MVC 中移除了 CheckBoxList,所以默认情况下 ASP.NET MVC 3 中是没有 CheckBoxList 的,所以我们不能直接使用 @Html.CheckBoxList。今天我们通过自己动手来实现 ASP.NET MVC 3 中的 CheckBoxList 功能。
首先,让我们看看我例子中两个表之间的关系,如下图:

ZTag 表中保存的是文章分类,ZArticle 表中 Tag 字段为文章分类,为"1,3,4"这种类型,因为一篇文章可能属于好几种分类,如它同时属于 jQuery、CSS等。
直接给出 CheckBoxList 扩展的实现,如下:
public static MvcHtmlString CheckBoxList(this HtmlHelper helper,
string name, IEnumerable<SelectListItem> items)
{
var str = new StringBuilder();
str.Append(@"<div class=""checkboxlist"">"); foreach (var item in items)
{
str.Append(@"<div class=""list""><input type=""checkbox"" name=""");
str.Append(name);
str.Append("\" value=\"");
str.Append(item.Value);
str.Append("\""); if (item.Selected)
str.Append(@" checked=""chekced"""); str.Append(" />");
str.Append(item.Text);
str.Append("</div>");
} str.Append("</div>"); return MvcHtmlString.Create(str.ToString());
}
关于扩展 ASP.NET MVC HtmlHelper 类在 ASP.NET MVC 3 分页这篇文章中就已经使用过了,并不难理解。其中我们使用到了 ASP.NET MVC 3 中自带的类 SelectListItem ,接下来完成 IEnumerable<SelectListItem> 初始化:
public static IEnumerable<SelectListItem> GetTags
(ZArticle article, IEnumerable<ZTag> tags)
{
var result = new List<SelectListItem>(); foreach (var tag in tags)
{
var item = new SelectListItem
{
Text = tag.Name,
Value = tag.ID.ToString(),
Selected = article.Tag.Split(',').Contains(tag.ID.ToString())
}; result.Add(item);
} return result;
}
我将方法放在了 Common 类中,方法分别传递了 ZArticle 对象和 IEnumberable<ZTag> 对象,目的是遍历 IEnumerable<ZTag> 来初始化 IEnumerable<SelectListItem> 对象,以便将 ZTag 表字段分别输出为 checkbox。最后只需要调用 GetTags() 方法,如在文章编辑 Action 中调用如下:
public ActionResult Edit(string id)
{
var article = db.Articles.Single(a => a.UrlName == id); var tags = db.Tags.OrderByDescending(m => m.ID);
var tag = Common.GetTags(article, tags);
ViewBag.Tags = tag; return View(article);
}
最后在 View 中调用如下:
@Html.CheckBoxList("tag", (IEnumerable<SelectListItem>)ViewBag.Tags)
结果如下图所示:

ASP.NET MVC 中我们要记住 Don't Do IT Yourself 原则,获取 CheckBoxList 选中值非常简单,接收选中值方法如下:
public ActionResult Edit(string id, string s,
ZArticle article,string[] tag)
{
article.UrlName = article.UrlName;
var model = db.Articles.Single(m => m.UrlName == id);
model.Tag = string.Join(",", tag); //文章所属类别
return View(model);
}
tag 即为我们调用 @Html.CheckBoxList 时使用的 "tag",也就是 CheckBox 的"name" 值,tag 即为 CheckBoxList 的选中值,最后使用 Join 方法将它转换为字符串。如下图:

到这里我们就实现了 ASP.NET MVC 3 中 CheckBoxList 的输出,并成功获取到 CheckBoxList 选中值,希望对在使用 ASP.NET MVC 3 但不知道如何使用 CheckBoxList 的朋友能带来一点帮助。
ASP.NET MVC 3 CheckBoxList 的使用的更多相关文章
- 再议ASP.NET MVC中CheckBoxList的验证
在ASP.NET MVC 4中谈到CheckBoxList,经常是与CheckBoxList的显示以及验证有关.我在"MVC扩展生成CheckBoxList并水平排列"中通过扩展H ...
- ASP.NET MVC中商品模块小样
在前面的几篇文章中,已经在控制台和界面实现了属性值的笛卡尔乘积,这是商品模块中的一个难点.本篇就来实现在ASP.NET MVC4下商品模块的一个小样.与本篇相关的文章包括: 1.ASP.NET MVC ...
- [引]ASP.NET MVC 4 Content Map
本文转自:http://msdn.microsoft.com/en-us/library/gg416514(v=vs.108).aspx The Model-View-Controller (MVC) ...
- MVC生成CheckBoxList并对其验证
原文:MVC生成CheckBoxList并对其验证 通过扩展方法,可以让CheckBox水平排列,生成CheckBoxList,正如"MVC扩展生成CheckBoxList并水平排列&quo ...
- ASP .NET MVC HtmlHelper扩展——简化“列表控件”的绑定
在众多表单元素中,有一类<select>元素用于绑定一组预定义列表.传统的ASP.NET Web Form中,它对应着一组重要的控件类型,即ListControl,我们经常用到DropDo ...
- ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积02, 在界面实现
在"ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现"中,在控制台应用程序中实现了属性值的笛卡尔乘积.本篇在界面中实现.需要实现的大致如下: 在界面 ...
- ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现
在电商产品模块中必经的一个环节是:当选择某一个产品类别,动态生成该类别下的所有属性和属性项,这些属性项有些是以DropDownList的形式存在,有些是以CheckBoxList的形式存在.接着,把C ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus
最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...
随机推荐
- IntelliSense: namespace "osgDB" 没有成员 "BEGIN_BRACKET"
IntelliSense: namespace "osgDB" 没有成员 "BEGIN_BRACKET" 转自:http://bbs.osgchina.org/ ...
- uva 1382 - Distant Galaxy
题目连接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=91208#problem/G 题意: 给出平面上的n个点,找出一个矩形,使得边 ...
- 李洪强iOS经典面试题129
1. 怎么解决缓存池满的问题(cell) ios中不存在缓存池满的情况,因为通常我们ios中开发,对象都是在需要的时候才会创建,有种常用的说话叫做懒加载,还有在UITableView中一般只会创建刚开 ...
- Mysql bench执行sql语句批量操作数据所遇到的问题
一.错误 rror Code: 1175. You are using safe update mode and you tried to update a table without a WHERE ...
- dede新建模型中自定义联动类别调用及修改方法
搜索了好久,没找到一个好的方法,就凑活用这个方法吧.也许只有这个方法比较好 先在后台的“联动类别管理”里新增“类别组”,“类 别 名”填中文,“缓存组名”填英文字母. 在“分类名称”后面增加分类 然后 ...
- # 20145334赵文豪 《Java程序设计》第7周学习总结
20145334赵文豪 <Java程序设计>第7周学习总结 教材学习内容总结 第十三章 时间与日期 13.1.1时间的度量 1.格林威治时间(GMT):参考太阳到达最高点,有时间误差. 2 ...
- PowerDesigner 15.2入门学习 二
PowerDesigner中如何生成主键和自增列 1.SQL Server版本: 第一步,首先要建立与数据库的连接,方法较多,这里举个例子: http://www.cnblogs.com/netsql ...
- 【转】Gvim开发环境配置笔记--Windows篇
配置文件(vimrc) set nocompatible set nu! set cursorline colorscheme murphy " vim 自身命令行模式智能补全 set wi ...
- Python脚本模拟登录网页之ZiMuZu篇
ZiMuZu.tv这个网站喜欢看电影看美剧的人一定都熟悉. 这个网站原先的升级策略是每天登陆网站, 然后去一个"每日签到"的页面点击一个签到按钮, 以实现帐号等级的升级. 之前网上 ...
- Python简明语法