在以前的 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 的使用的更多相关文章

  1. 再议ASP.NET MVC中CheckBoxList的验证

    在ASP.NET MVC 4中谈到CheckBoxList,经常是与CheckBoxList的显示以及验证有关.我在"MVC扩展生成CheckBoxList并水平排列"中通过扩展H ...

  2. ASP.NET MVC中商品模块小样

    在前面的几篇文章中,已经在控制台和界面实现了属性值的笛卡尔乘积,这是商品模块中的一个难点.本篇就来实现在ASP.NET MVC4下商品模块的一个小样.与本篇相关的文章包括: 1.ASP.NET MVC ...

  3. [引]ASP.NET MVC 4 Content Map

    本文转自:http://msdn.microsoft.com/en-us/library/gg416514(v=vs.108).aspx The Model-View-Controller (MVC) ...

  4. MVC生成CheckBoxList并对其验证

    原文:MVC生成CheckBoxList并对其验证 通过扩展方法,可以让CheckBox水平排列,生成CheckBoxList,正如"MVC扩展生成CheckBoxList并水平排列&quo ...

  5. ASP .NET MVC HtmlHelper扩展——简化“列表控件”的绑定

    在众多表单元素中,有一类<select>元素用于绑定一组预定义列表.传统的ASP.NET Web Form中,它对应着一组重要的控件类型,即ListControl,我们经常用到DropDo ...

  6. ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积02, 在界面实现

    在"ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现"中,在控制台应用程序中实现了属性值的笛卡尔乘积.本篇在界面中实现.需要实现的大致如下: 在界面 ...

  7. ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现

    在电商产品模块中必经的一个环节是:当选择某一个产品类别,动态生成该类别下的所有属性和属性项,这些属性项有些是以DropDownList的形式存在,有些是以CheckBoxList的形式存在.接着,把C ...

  8. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  9. 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus

    最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...

随机推荐

  1. 深入浅出 - Android系统移植与平台开发(三)- 编译并运行Android4.0模拟器

    作者:唐老师,华清远见嵌入式学院讲师. 1.   编译Android模拟器 在Ubuntu下,我们可以在源码里编译出自己的模拟器及SDK等编译工具,当然这个和在windows里下载的看起来没有什么区别 ...

  2. silverlight Canvas、StackPanel、Grid三者之间的关系

    学习 silverlight   首先Canvas.StackPanel.Grid 博客园里看到jailu的这篇文章整理得很好 贴下来: Silverlight提供了非常灵活的布局管理系统,让程序员和 ...

  3. RecyclerView使用时遇到的问题

    一.概述 二.常见问题: 1.如何为RecyclerView的Item设置点击事件? 1.1 问题描述 类似于下列方法 RecyclerView.setOnItemClickListener(OnCl ...

  4. .net 文件下载【转】

    方式一:TransmitFile实现下载.将指定的文件直接写入 HTTP 响应输出流,而不在内存中缓冲该文件.     protected void Button1_Click(object send ...

  5. C/C++中的实参和形参

    今天突然看到一道关于形参和实参的题,我居然不求甚解.藐视过去在我的脑海里只有一个参数的概念,对于形参和实参的区别还真的不知道,作为学习了几年C++的人来说,真的深深感觉对不起自己对不起C++老师  T ...

  6. 2016huasacm暑假集训训练三 C - Til the Cows Come Home

    题目链接:http://acm.hust.edu.cn/vjudge/contest/123674#problem/C N题目大意是有n个点,然后给出从a点到b点的距离,a和b是互相可以抵达的,则是无 ...

  7. mysql入门教程

    mysql相信大家都非常熟悉,but读音你们都读对了么?MySQL [maɪ ˌɛskjuːˈɛl] [maɪ ˈsiːkwəl] 念 买S奎儿 或 买吸扣 都可以,还有好多容易读错的名词,详情请见I ...

  8. DBConfigReader.java

    package com.vcredit.ddcash.batch.util; import java.sql.Connection;import java.sql.PreparedStatement; ...

  9. pch头文件

    1.command+N ---> Other ---> PCH File 2.点击工程 ---> Build Settings ---> 搜索框中输入pref ---> ...

  10. loading.gif