前面几篇文章介绍了一下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. Unity 之 图片显示的真实大小

    图片放入Unity中自身的属性 在做帽子游戏的时候,看到这么一段代码 //获取保龄球的自身宽度 float ballWidth=ball.GetComponent<Renderer>(). ...

  2. java中的抽象类和抽象方法

    知识点:java中的抽象类和抽象方法 关键字abstract意为抽象的,可以用来修饰类和方法,分别称作抽象类和抽象方法 抽象类一般在多态的场景中使用 一:抽象类(abstract class) 在类的 ...

  3. DPDK的安装与绑定网卡

    DPDK的安装有两种方法: 第一种是使用dpdk/tools/setup.sh选择命令字来安装:第二种是自己手动安装.为了更好地熟悉DPDK,我使用第二种方法. 0.设定环境变量 export RTE ...

  4. 【TCP/IP详解 卷一:协议】第9章 IP选路

    推荐链接:网络地址与主机地址 9.1 引言 路由选择程序(daemon),通常这是一个用户进程.在大多数的Unix系统中,大多数的路由选择程序都是路由程序和网关程序. 路由表经常被IP访问,但是它被路 ...

  5. ftp协议及vsftpd的基本应用

    1.ftp协议及vsftpd的基本应用 vsftpd 是"very secure FTP daemon"的缩写,安全性是它的一个最大的特点.vsftpd 是一个 UNIX 类操作系 ...

  6. DDSM数据处理之PngWithOverlay 框出病灶区域

    修改代码路径 若overlay是某一侧的标注. 文件夹里某一侧的png 应该有对应 某一侧的overlay 这样一一对应才可以使得代码运行. 否则需要手动删除没有overlay的png图片. 左侧没有 ...

  7. clipboard异步复制文本(动态获取文本)

    1.需求描述: 点击“分享”按钮的时候,发送 ajax 请求获得动态邀请连接,成功取得数据后复制到剪贴板 2.解决重点: > Clipboard 动态设置文本的使用 > Ajax请求设置为 ...

  8. MongoDB(课时22 唯一索引)

    3.6.1 唯一索引 唯一索引的主要目的是用在某一个字段上,使该字段的内容不重复. 范例:创建唯一索引 db.students.ensureIndex({"name" : 1}, ...

  9. Qt5_加载DLL

    1.QLibrary 加载普通 DLL //写清楚库的路径,如果放在当前工程的目录下,路径为./Oracle.so QLibrary *libOCI = new QLibrary("F:\\ ...

  10. Qt加载OSg视图例子

    //QT += core gui opengl //LIBS += -losgViewer -losgDB -losgUtil -losg -lOpenThreads -losgGA -losgQt ...