爱上MVC~为DisplayNameFor添加扩展,支持PagedList集合
DisplayNameFor方法是MVC提供给我们的,它可以将模型的DisplayName特性的值显示到页面上,这对程序员来说很是方便,在进行实体设计时,可以指定它的显示名称,然后MVC引擎会自动帮助我们生成DisplayNameFor代码断,而我们的所有字段的名称就显示到了页面上,一切就这样简单,即使你在列表页,你的模型IEnumerable<T>也可以很容易的被支持,而在大叔框架里,分页列表使用了模型PagedList<T>,这当然不会被微软兼容,所以,大叔为些特意为DisplayNameFor这个方法写了一个扩展,让它支持大叔的分页,并且支持导航属性的DisplayName,例如,UserInfo.UserExtension.NickName,它就会把UserExtension类的NickName字段的描述信息显示出来!
代码属于扩展方法,所以要写在静态类中,呵呵
/// <summary>/// 大叔为DisplayName进行了扩展/// </summary>public static class DisplayNameExtensions{/// <summary>/// 显示字段的名称DisplayName的值/// </summary>/// <typeparam name="TModel"></typeparam>/// <typeparam name="TValue"></typeparam>/// <param name="html"></param>/// <param name="expression"></param>/// <returns></returns>public static MvcHtmlString DisplayNameFor<TModel, TValue>(this HtmlHelper<PagedList<TModel>> html, Expression<Func<TModel, TValue>> expression){Type t = typeof(TModel);// string propertyName = GetPropertyName<TModel, TValue>(expression);var complex = ExpressionHelper.GetExpressionText(expression).Split('.');string propertyName = complex.Last();if (complex.Count() > 1){t = t.GetProperty(complex[complex.Length - 2]).PropertyType;}var p = t.GetProperty(propertyName);if (p != null){var attr1 = p.GetCustomAttribute(typeof(DisplayNameAttribute));var attr2 = p.GetCustomAttribute(typeof(DisplayAttribute));if (attr1 != null){return MvcHtmlString.Create(((System.ComponentModel.DisplayNameAttribute)attr1).DisplayName);}if (attr2 != null){return MvcHtmlString.Create(((DisplayAttribute)attr2).Name);}}return MvcHtmlString.Create(string.Empty);}public static MvcHtmlString DisplayNameFor<TModel, TEnumerable, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, PagedList<TEnumerable>>> enumerableExpression, Expression<Func<TEnumerable, TValue>> valueExpression){var metadata = ModelMetadata.FromLambdaExpression(valueExpression, new ViewDataDictionary<TEnumerable>());string displayName = metadata.DisplayName ?? metadata.PropertyName ?? ExpressionHelper.GetExpressionText(valueExpression).Split('.').Last();return new MvcHtmlString(HttpUtility.HtmlEncode(displayName));}}
运行的结果如图
其实,在进行建立和编辑时,MVC为我们的DisplayNameFor已经实现了导航属性的字段显示功能,这个也是我在测试之后才发现的,呵呵
有一点还是要注意的,在表单元素上,你的导航属性的字段命名是类名+字段名,而在id和name这两个标签中,又有不同,id是类名与字段之间用“下划线”分开,而name是用“点”分开的,这点大家要清晰!
这一点如果Action在接收时使用的是FormCollection或者直接Request.Form时,就需要大家特别注意了,它们请求的是表单的name,而不是id,我们可以从图中清晰的看到
而如果你的action中,参数使用的是实体,那么MVC会帮助我们自动进行填充,省事了,呵呵!
好了,不早了,今天的MVC就说到这里了!
感谢您的阅读!
本文转自博客园张占岭(仓储大叔)的博客,原文链接:爱上MVC~为DisplayNameFor添加扩展,支持PagedList集合,如需转载请自行联系原博主。
爱上MVC~为DisplayNameFor添加扩展,支持PagedList集合相关推荐
- 【邹健】Asp.net MVC Fckeditor的扩展(支持PV3及自动绑定)
Asp.net MVC Fckeditor的扩展(支持PV3及自动绑定) function StorePage(){d=document;t=d.selection?(d.selection.type ...
- linux下用phpize给PHP动态添加扩展
使用php的常见问题是:编译php时忘记添加某扩展,后来想添加扩展,但是因为安装php后又装了一些东西如PEAR等,不想删除目录重装,别说,php还真有这样的功能. 我没有在手册中看到. 如我想增加b ...
- (转)[翻译] ASP.NET MVC Tip #1 - 使用扩展方法创建新的HTML Helper
原文地址:http://weblogs.asp.net/stephenwalther/archive/2008/06/13/asp-net-mvc-tip-1-creating-new-html-he ...
- 爱上MVC~为非法进行Action的用户提供HttpStatusCodeResult
对一MVC来说,它有Controller和Action,其中Action用来为页面提供数据和相关逻辑,并最后将页面渲染出来,而有些action是需要一些参数的,如文章的最终页,可能需要一个ID,而这个 ...
- Mvc 自带分页控件PagedList.Mvc Demo示例
添加/下载PagedList.Mvc 直接搜索mvc pagelist 就会出来.安装完成即可.在项目的packages文件夹下面就会出现PagedList.Mvc.4.5.0.0 和PagedLis ...
- 如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理...
这篇文章介绍一下,如何使用VS2017给asp.net core添加容器支持,并发布镜像到私有docker hub,然后用chart管理容器镜像的操作流程. 话不多说,just do it. 新建项目 ...
- (转)springboot:添加JSP支持
转自: 14.springboot:添加JSP支持 - 简书(1)创建Maven web project 使用Eclipse新建一个Maven Web Project ,项目取名为:spring-bo ...
- MVC html 控件扩展【转载】
项目中用到mvc2控件扩展,任务分给了我,开发完了,结果可能要用devexpress,费了不少功夫,网上查找资料,整理成符合项目的,自己留个备份吧,一起学习 DropDownTree 第一个控件是Dr ...
- php自己编译扩展,Linux编译PHP添加扩展库的方法
在编译PHP的时候除了必要的目录指定,好多参数都没有加--等我在安装web程序的时候,才发现,很多参数是要加上的,但是我lnmp已经搭建好了,也不想重新编译,重新安装..于是就在网上找到了此文 一.添 ...
最新文章
- 2012腾讯春季实习生面试经历(一)
- QT5运行错误:ImportError: cannot import name QAxContainer from PyQt5 解决
- 数字调制系统工作原理_空间光调制器工作原理是什么 空间光调制器工作原理...
- Spring管理的交易说明-第2部分(JPA)
- 如何打印出给定尺寸的方格_打印给定号码的表格| 8086微处理器
- linux配置rsync服务器
- python codefirst_Python code.co_consts方法代码示例
- nginx 配置反向代理
- 这届年轻人为什么都不爱看电视了?
- 清北复交人浙南 计算机交叉学科项目大盘点
- 第一篇:FC-SAN存储技术
- 防止号码丢失之电话簿云端备份
- 吴伯凡-认知方法论-既然认知意味着痛苦,为什么选择认知?
- Android之TabActivity的使用
- 关于MP4视频在浏览器上无法播放的问题(没有找到支持的视频格式和mime类型)
- java实现数字金额转换成汉字大写金额
- 上海腾享-舞台灯光设备为实现安全稳定、灵活多变、色彩绚丽的舞台灯光效果
- LiveGBS国标流媒体GB28181微信无插件直播如何实现跨域鉴权
- LIBXML2 2.9.11 build for Android
- iStat菜单入门指南:菜单栏项目未显示怎么解决