爱上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就说到这里了!
感谢您的阅读!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2011-10-26 MVC解决更新冲突问题