前面几篇文章介绍了一下ASP.NET MVC中的一些基础,今天我们一起来学习一下在ASP.NET MVC中控件的封装。在页面中我们会经常使用到Html对象,来程序控件,当然这里的控件不是说ASP.NET中包含很多ViewState或其他信息的控件。在ASP.NET MVC中控件就是扩展方法,主要对HtmlHelper实例的扩展,不过这里主要会提到CheckBoxList和RadioButtonList的扩展,因为在微软自带的控件中是没有这两个控件存在的,所以我们需要自己扩展。最后还会介绍一下,Html.CheckBoxFor这个控件在使用时会有两个值,在服务端进行判断的结果。

ASP.NET MVC(包含MVC3.0,MVC4.0)中的控件都在System.Web.Mvc中,这里需要了解一下HtmlMvcString和普通的string的区别。在我看来HtmlMvcString就是对string进行编码,使得浏览器能够正确解析HTML字符串。这样在前台显示时就不需要使用Html.Raw方法对字符串进行编码,否则显示的字符串将不会解析成HTML代码。这个只需了解就可以了,有兴趣可以试试就知道所以然了,所以MVC控件都需要返回这个对象。

在ASP.NET MVC中,lumbda表达式是很经常用的,而且非常好用。在页面中声明了一个模型,那样就可以使用lumbda表达式进行实例的赋值和判断,当然在对控件扩展时就会预见到表达式的使用,这些都是.NET3.5的特性,这里就不多赘述。


 1         /// <summary>
 2         /// 复选框扩展。
 3         /// </summary>
 4         /// <typeparam name="TModel">模型类型。</typeparam>
 5         /// <typeparam name="TProperty">属性类型。</typeparam>
 6         /// <param name="helper">HTML辅助方法。</param>
 7         /// <param name="expression">lambda表达式。</param>
 8         /// <param name="selectList">选择项。</param>
 9         /// <param name="htmlAttributes">HTML属性。</param>
10         /// <returns>返回复选框MVC的字符串。</returns>
11         public static MvcHtmlString CheckBoxListFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, ButtonFormatter formatter = ButtonFormatter.Horizontal, IDictionary<string, object> htmlAttributes = null)
12         {
13             if(selectList == null || expression == null)
14                 return MvcHtmlString.Empty;
15             string name = ExpressionHelper.GetExpressionText(expression);
16             List<string> values = null;
17             object obj = helper.ViewData.Eval(name);
18             if(obj != null)
19                 values = obj.ToString().Split<string>();
20             else
21                 values = new List<string>();
22 
23             StringBuilder sb = new StringBuilder();
24             int index = 0;
25             foreach(var item in selectList)
26             {
27                 TagBuilder tag = new TagBuilder("input");
28                 tag.MergeAttributes<string, object>(htmlAttributes);
29                 tag.MergeAttribute("type", "checkbox", true);
30                 tag.MergeAttribute("name", name, true);
31                 tag.MergeAttribute("id", name + index, true);
32                 tag.MergeAttribute("value", item.Value, true);
33                 if(values.Contains(item.Value))
34                     tag.MergeAttribute("checked", "checked", true);
35                 sb.AppendLine(tag.ToString(TagRenderMode.SelfClosing) + " ");
36                 TagBuilder label = new TagBuilder("label");
37                 label.MergeAttribute("for", name + index);
38                 label.InnerHtml = item.Text;
39                 sb.AppendLine(label.ToString());
40                 if(formatter == ButtonFormatter.Vertical)
41                     sb.AppendLine("<br />");
42                 index++;
43             }
44             return new MvcHtmlString(sb.ToString());
45         }
46 
47         /// <summary>
48         /// 复选框扩展。
49         /// </summary>
50         /// <typeparam name="TModel">模型类型。</typeparam>
51         /// <typeparam name="TProperty">属性类型。</typeparam>
52         /// <param name="helper">HTML辅助方法。</param>
53         /// <param name="expression">lambda表达式。</param>
54         /// <param name="selectList">选择项。</param>
55         /// <param name="htmlAttributes">HTML属性。</param>
56         /// <returns>返回复选框MVC的字符串。</returns>
57         public static MvcHtmlString CheckBoxListFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, ButtonFormatter formatter, object htmlAttributes)
58         {
59             return helper.CheckBoxListFor<TModel, TProperty>(expression, selectList, formatter, new RouteValueDictionary(htmlAttributes));
60         }
61 
62         /// <summary>
63         /// 枚举复选框扩展。
64         /// </summary>
65         /// <typeparam name="TModel">模型类型。</typeparam>
66         /// <typeparam name="TProperty">属性类型。</typeparam>
67         /// <param name="helper">HTML辅助方法。</param>
68         /// <param name="expression">lambda表达式。</param>
69         /// <param name="selectList">选择项。</param>
70         /// <param name="htmlAttributes">HTML属性。</param>
71         /// <returns>返回复选框MVC的字符串。</returns>
72         public static MvcHtmlString CheckBoxListFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, ButtonFormatter formatter = ButtonFormatter.Horizontal, object htmlAttributes = null, string classKey = Globals.Resource)
73         {
74             var selectList = new List<SelectListItem>();
75             Globals.ForEach<TProperty>(p => {
76                 selectList.Add(new SelectListItem { Text = Globals.GetGlobalResourceByKey(p, classKey), Value = p.ToString() });
77             });
78             return helper.CheckBoxListFor<TModel, TProperty>(expression, selectList, formatter, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));

79         }

上面的代码各位有需要可以直接复制编译后就可以使用了,其他涉及的资源的可以修改一下。而ButtonFormatter是一个枚举类,主要用于设计横排还是竖排的样式,其他没什么作用。这样我们就可以很快的再前台使用CheckBoxList控件了,注意不是所有的页面都有模型,或者说不是所有CheckBoxList都可以使用lumbda表达式来进行赋值等设置的,所以最好扩展一下CheckBoxList控件,那样在各种情况都可以使用。

以上是我早期扩展的一个控件,其实很多地方都可以改的,比如属性转换,匿名类型可以直接实例化为RouteValueDictionary的,他的构造函数里就有这个。其中Globals.ForEach是我对枚举迭代的一个扩展,即是循环枚举中的每一个值显示出来。而RadioButtonList的扩展和CheckBoxList的扩展是差不多的,只要标记替换一下就可以了,不过在大部分情况下比较少用,因为很多地方都被DropDownList替代。

下面介绍一下在使用CheckBox时,服务端获取是否选中的方法。假如你使用过这个控件就会发现,呈现的HTML代码中包含两个checkbox的input,只是其中一个被隐藏了,当我们使用submit按钮提交时,在服务端获得的值就会包含两个input的值。为了解决这个问题,我们需要判断一下到底有没有被选中,不难发现,如果没有被选中,这服务端获取得到的值就只有一个False的值,如果选中了就会有两个,一个True一个False,所以我们需要判断到底服务端获得的第一个值是False还是True,具体代码可以看下面。

1 /// <summary>


 2         /// 判断是否被选中。
 3         /// </summary>
 4         /// <param name="form">路由实例对象。</param>
 5         /// <param name="key">路由键。</param>
 6         /// <param name="defaultValue">返回默认值。</param>
 7         /// <returns>返回是否被选中。</returns>
 8         public static bool IsChecked(this FormCollection form, string key, bool defaultValue = false)
 9         {
10             var values = form.GetValues(key);
11             if(values!=null)
12                 return values[0].To<bool>(defaultValue);
13             return defaultValue;
14         }
15 
16         /// <summary>
17         /// 判断是否被选中。
18         /// </summary>
19         /// <param name="request">路由实例对象。</param>
20         /// <param name="key">路由键。</param>
21         /// <param name="defaultValue">返回默认值。</param>
22         /// <returns>返回是否被选中。</returns>
23         public static bool IsChecked(this HttpRequestBase request, string key, bool defaultValue = false)
24         {
25             var values = request.Form.GetValues(key);
26             if(values != null)
27                 return values[0].To<bool>(defaultValue);
28             return defaultValue;
29         }

其中To这个方法是我封装类型转换的方法,由于本系列没有一个良好的规划,想到哪里就写到哪里,很多达人看了可能不会有连续性。主要我还是推荐学基础可以到MSDN或博客园里也有按照微软Tutorial顺序写的教程,由于时间的关系今天到此结束。

跟我一起学习ASP.NET 4.5 MVC4.0(五)的更多相关文章

  1. 跟我一起学习ASP.NET 4.5 MVC4.0(二)

    上一篇文章中(跟我一起学习ASP.NET 4.5 MVC4.0(一))我们基础的了解了一下ASP.NET MVC4.0的一些比较简单的改变,主要是想对于MVC3.0来说的.因为这一些列主要是要给ASP ...

  2. 跟我一起学习ASP.NET 4.5 MVC4.0(一)

    跟我一起学习ASP.NET 4.5 MVC4.0(一)   由于上面一个项目使用的是ASP.NET4.0 MVC3.0,在招人的时候发现很多人有听说过MVC,但是却是没用过,对MVC也只是一知半解,最 ...

  3. 跟我一起学习ASP.NET 4.5 MVC4.0 (转)

    跟我一起学习ASP.NET 4.5 MVC4.0(一)   由于上面一个项目使用的是ASP.NET4.0 MVC3.0,在招人的时候发现很多人有听说过MVC,但是却是没用过,对MVC也只是一知半解,最 ...

  4. 跟我一起学习ASP.NET 4.5 MVC4.0(五)(转)

    前面几篇文章介绍了一下ASP.NET MVC中的一些基础,今天我们一起来学习一下在ASP.NET MVC中控件的封装.在页面中我们会经常使用到Html对象,来程序控件,当然这里的控件不是说ASP.NE ...

  5. 跟我一起学习ASP.NET 4.5 MVC4.0(一)(转)

    由于上面一个项目使用的是ASP.NET4.0 MVC3.0,在招人的时候发现很多人有听说过MVC,但是却是没用过,对MVC也只是一知半解,最近想给团队成员做一个系统的解说,让大家都可以学习一下ASP. ...

  6. 跟我一起学习ASP.NET 4.5 MVC4.0(六)(转)

    这一系列文章跨度有点大,由于最近忙于其他事情,没有更新,今天重新安装了下Win8系统,VS2012和SQLServer 2012,顺便抽空继续一篇.随着VS2012 RC版本的放出,ASP.NET M ...

  7. 跟我一起学习ASP.NET 4.5 MVC4.0(四)(转)

    前几个文章中介绍了一些关于MVC4.0的东东,今天我们来看一下登陆验证,也可以说是权限验证,即AuthorizeAttribute.这个可以使用在控制器Controller上,也可以使用在Action ...

  8. 跟我一起学习ASP.NET 4.5 MVC4.0(三)(转)

    今天我们继续ASP.NET 4.5 MVC 4.0,前两天熟悉了MVC4.0在VS11和win8下的更新,以及MVC中的基础语法和几个关键字的使用.了解了这些就可以对MVC进一步认识,相信很多人都对M ...

  9. 跟我一起学习ASP.NET 4.5 MVC4.0(六)

    这一系列文章跨度有点大,由于最近忙于其他事情,没有更新,今天重新安装了下Win8系统,VS2012和SQLServer 2012,顺便抽空继续一篇.随着VS2012 RC版本的放出,ASP.NET M ...

随机推荐

  1. 用Win32 实现进度条

    转载:http://www.cctry.com/thread-238862-1-1.html #include <windows.h> #include <commctrl.h> ...

  2. Python3基础 tuple 创建空元组或者只有一个元素的元组 并 用乘法成倍扩充

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. 高通平台读写nv总结【转】

    本文转载自:https://blog.csdn.net/suofeng12345/article/details/52713993 一,引言      1. 什么是NV       高通平台的NV,保 ...

  4. cygwin下使用apt-cyg安装新软件

    1.获取  (记得先安装好git) git clone https://github.com/transcode-open/apt-cyg.git 2.安装apt-cyg cd apt-cyg chm ...

  5. 第七章 对称加密算法--DES

    注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第7章“初等加密算法--对称加密算法” 7.1.对称加密算法 特点: 加密与解密使用同一个密钥 是使用最广的算法 常见对称加密 ...

  6. 解决Eclipse 项目报错:Unbound classpath container: ‘JRE System Library [JavaSE-1.7]

    MyEclipse出现下面两条报错: The project cannot be built until build path errors are resolved HelloWord Unknow ...

  7. C++快速输入输出优化

    在这里存一下我的快速输入输出优化 以及写题模板 这里的是$getchar$优化和$putchar$优化,$fread$和$fwrite$暂时咕咕咕 快速输入 这里$define$了一个$I\_int$ ...

  8. 伪类:after的使用以及结合attr来添加属性的技巧

    本案例以实现侧边栏的效果为例来说明 直接上代码看效果: css <style type="text/css"> *{;;list-style: none;} ul{;t ...

  9. MariaDB / MySQL数据类型

    MariaDB / MySQL 数据类型 有三种主要的类型:Text(文本).Number(数字)和 Date/Time(日期/时间)类型. Text 类型: 数据类型 描述 CHAR(size) 保 ...

  10. BZOJ 1009: [HNOI2008]GT考试(kmp+dp+矩阵优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 思路:真的是好题啊! 对于这种题目,很有可能就是dp,$f[i][j]$表示分析到第 ...