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集合相关推荐

  1. 【邹健】Asp.net MVC Fckeditor的扩展(支持PV3及自动绑定)

    Asp.net MVC Fckeditor的扩展(支持PV3及自动绑定) function StorePage(){d=document;t=d.selection?(d.selection.type ...

  2. linux下用phpize给PHP动态添加扩展

    使用php的常见问题是:编译php时忘记添加某扩展,后来想添加扩展,但是因为安装php后又装了一些东西如PEAR等,不想删除目录重装,别说,php还真有这样的功能. 我没有在手册中看到. 如我想增加b ...

  3. (转)[翻译] 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 ...

  4. 爱上MVC~为非法进行Action的用户提供HttpStatusCodeResult

    对一MVC来说,它有Controller和Action,其中Action用来为页面提供数据和相关逻辑,并最后将页面渲染出来,而有些action是需要一些参数的,如文章的最终页,可能需要一个ID,而这个 ...

  5. Mvc 自带分页控件PagedList.Mvc Demo示例

    添加/下载PagedList.Mvc 直接搜索mvc pagelist 就会出来.安装完成即可.在项目的packages文件夹下面就会出现PagedList.Mvc.4.5.0.0 和PagedLis ...

  6. 如何使用vs将asp.net core项目添加容器支持并发布docker镜像到私有dockerhub和添加k8s/helm管理...

    这篇文章介绍一下,如何使用VS2017给asp.net core添加容器支持,并发布镜像到私有docker hub,然后用chart管理容器镜像的操作流程. 话不多说,just do it. 新建项目 ...

  7. (转)springboot:添加JSP支持

    转自: 14.springboot:添加JSP支持 - 简书(1)创建Maven web project 使用Eclipse新建一个Maven Web Project ,项目取名为:spring-bo ...

  8. MVC html 控件扩展【转载】

    项目中用到mvc2控件扩展,任务分给了我,开发完了,结果可能要用devexpress,费了不少功夫,网上查找资料,整理成符合项目的,自己留个备份吧,一起学习 DropDownTree 第一个控件是Dr ...

  9. php自己编译扩展,Linux编译PHP添加扩展库的方法

    在编译PHP的时候除了必要的目录指定,好多参数都没有加--等我在安装web程序的时候,才发现,很多参数是要加上的,但是我lnmp已经搭建好了,也不想重新编译,重新安装..于是就在网上找到了此文 一.添 ...

最新文章

  1. 2012腾讯春季实习生面试经历(一)
  2. QT5运行错误:ImportError: cannot import name QAxContainer from PyQt5 解决
  3. 数字调制系统工作原理_空间光调制器工作原理是什么 空间光调制器工作原理...
  4. Spring管理的交易说明-第2部分(JPA)
  5. 如何打印出给定尺寸的方格_打印给定号码的表格| 8086微处理器
  6. linux配置rsync服务器
  7. python codefirst_Python code.co_consts方法代码示例
  8. nginx 配置反向代理
  9. 这届年轻人为什么都不爱看电视了?
  10. 清北复交人浙南 计算机交叉学科项目大盘点
  11. 第一篇:FC-SAN存储技术
  12. 防止号码丢失之电话簿云端备份
  13. 吴伯凡-认知方法论-既然认知意味着痛苦,为什么选择认知?
  14. Android之TabActivity的使用
  15. 关于MP4视频在浏览器上无法播放的问题(没有找到支持的视频格式和mime类型)
  16. java实现数字金额转换成汉字大写金额
  17. 上海腾享-舞台灯光设备为实现安全稳定、灵活多变、色彩绚丽的舞台灯光效果
  18. LiveGBS国标流媒体GB28181微信无插件直播如何实现跨域鉴权
  19. LIBXML2 2.9.11 build for Android
  20. iStat菜单入门指南:菜单栏项目未显示怎么解决

热门文章

  1. [置顶] 贝叶斯分类(一)
  2. centos 6推荐使用epel源
  3. 学习,是前进的必由之路
  4. python3 reqeusts后写入excel
  5. 微信小游戏 Egret开发数据域官方Demo下载地址
  6. JavaScript学习总结(一)——ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)...
  7. 缓存Cookie、session、localStorage的区别
  8. 人工神经网络基本特点
  9. 开发HTML5的强大9个开发工具
  10. iOS安全攻防(三):使用Reveal分析他人app