前面几篇文章介绍了一下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. Python3基础 list 查看filter()返回的对象

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

  2. Python3基础 type 获得变量的类型

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

  3. ubuntu 安转redis

    一 ,redis 安装配置 在 Ubuntu 系统安装 Redis 可以使用以下命令: sudo apt-get update sudo apt-get install redis-server 这样 ...

  4. win10中mount和unmount iso文件

    https://www.windowscentral.com/how-mount-or-unmount-iso-images-windows-10 You can also right-click t ...

  5. 【Android实验】 数据存储与访问sqlite

    目录 实验目的 实验要求 实验过程 功能分析: 实验结果: 实验的代码 实验总结 实验目的     分别使用sqlite3工具和Android代码的方式建立SQLite数据库.在完成建立数据库的工作后 ...

  6. 列举一些有所帮助的blog和文章

    w3school hdoj imooc CSDN Github myGithub CmdMarkdown 一直在路上--记我从初中到本科近十年的学习成长历程 作者:周见智 C++中队列的建立与操作详细 ...

  7. Selenium 对窗口对HTML的操作举例

  8. Mysql-SqlServer区别

    /* sql规范 所有关键字大写 表面跟字段跟数据库对应 一条sql语句结束必须跟;号 */ /*关键字处理*/ --sqlserver SELECT * FROM [Date]; --mysql S ...

  9. [原][译][physX]phsyX3.3.4官方文档物理引擎基本概念和例子介绍

    世界和物体: 物理世界包括集合的场景,每个包含的物体称为演员(Actors) 每个场景(Scene)都定义了自己的参考框架包含了所有的时间和空间 在不同的场景,演员不互相影响 演员通常有三种类型:刚体 ...

  10. Lua和C++交互 学习记录之一:C++嵌入脚本

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...