Asp.net MVC5 框架揭秘 S412 实例解析 – 绝妙的扩展 模式的胜利
Asp.net MVC5 框架是个 开源的,处处可扩展的框架。
蒋先生 在他的这本书里 对如何理解框架,如何扩展框架, 给出了大量的说明和实例。
先上效果图

大部分做传统BS 的同学看到这个页面,脑海里的第一反应 就是一堆HTML 一堆控件 然后 后台绑定什么的吧。
但请看页面的代码。
- @model MvcApp.Models.Employee
- <html>
- <head>
- <title>编辑员工信息</title>
- </head>
- <body>
- <table>
- <tr>
- <td>@Html.LabelFor(m => m.Name)</td>
- <td>
- @Html.EditorFor(m => m.Name)
- </td>
- </tr>
- <tr>
- <td>@Html.LabelFor(m => m.Gender)</td>
- <td>
- @Html.EditorFor(m => m.Gender)
- </td>
- </tr>
- <tr>
- <td>@Html.LabelFor(m => m.Education)</td>
- <td>
- @Html.EditorFor(m => m.Education)
- </td>
- </tr>
- <tr>
- <td>@Html.LabelFor(m => m.Departments)</td>
- <td>
- @Html.EditorFor(m => m.Departments)
- </td>
- </tr>
- <tr>
- <td>@Html.LabelFor(m => m.Skills)</td>
- <td>
- @Html.EditorFor(m => m.Skills)
- </td>
- </tr>
- </table>
- </body>
- </html>
怎么做的呢? 这个MvcApp.Models.Employee 又是什么呢?为什么会很神奇的变成一堆 各种各样的 list 控件呢?
- namespace MvcApp.Models
- {
- public class Employee
- {
- [DisplayName("姓名")]
- public string Name { get; set; }
- [RadioButtonList("Gender")]
- [DisplayName("性别")]
- public string Gender { get; set; }
- [DropdownList("Education")]
- [DisplayName("学历")]
- public string Education { get; set; }
- [ListBox("Department")]
- [DisplayName("所在部门")]
- public IEnumerable<string> Departments { get; set; }
- [CheckBoxList("Skill")]
- [DisplayName("擅长技能")]
- public IEnumerable<string> Skills { get; set; }
- }
- }
看到这里对C# 和 .net 熟悉的同学一定心理有点谱了吧,特性!哦原来全是通过特性反射的呀。那又是如何反射的呢?

ListAttribute 继承了IMetadataAware 接口 然后MVC框架在创建View Model 时就会触发 事件 OnMetaDataCreated。
接着MVC 框架再通过 TemplateHint 确定了各个特性会对应的子模板,这里完全是通过名称的映射一一对应的。

然后再在模板中通过代码@Html.DropDownList("", listName, Model)
去调用对自定义的对HtmlHelper 的扩展方法 DropDownList,然后在这个扩展方法中再去取得需要的列表数据IEnumerable<ListItem>,再根据这个列表数据来构建需要的List<SelectListItem>
最后再调用已有的htmlHelper.DropDownList(name, selectListItems); 返回了需要的MvcHtmlString
整个扩展到此完毕。
同时还有许多疑点可以深究。
比如@Html.DropDownList("", listName, Model) 这段代码的第一个参数,到底起了什么作用呢?为什么是个空值呢?
通过实际测试我发现在赋空值和非空的情况下生成的HTML 有如下区别。
- "" 参数
- <tr>
- <td><label for="Education">学历</label></td>
- <td>
- <select id="Education" name="Education"><option value="H">高中</option>
- <option value="B">大学本科</option>
- <option selected="selected" value="M">硕士</option>
- <option value="D">博士</option>
- </select>
- </td>
- </tr>
- "Test" 参数
- <tr>
- <td><label for="Education">学历</label></td>
- <td>
- <select id="Education_test" name="Education.test"><option value="H">高中</option>
- <option value="B">大学本科</option>
- <option selected="selected" value="M">硕士</option>
- <option value="D">博士</option>
- </select>
- </td>
- </tr>
具体为何会有如上区别,请去研究代码看书吧。
玩Asp.net MVC 的同学 你真的发挥出 Asp.net MVC 这个框架的强大威力了么?
Asp.net MVC5 框架揭秘 S412 实例解析 – 绝妙的扩展 模式的胜利的更多相关文章
- ASP.NET MVC5框架揭秘 学习笔记01
1.自治视图 在早期(作者也没说明是多早,自己猜吧),我们倾向于将所有与UI相关的操作糅合在一起(现在我身边还有很多人这样做),这些操作包括UI界面的呈现. 用户交互操作的捕捉与响应(UI处理逻辑). ...
- [ASP.NET Core 3框架揭秘] 依赖注入[3]:依赖注入模式
IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架之中以实现对流程的复用,并按照"好莱坞法则"实现应用程序的代码与框架之间的交互.我们可以采用若干设计模式 ...
- ASP.NET Core框架揭秘[博文汇总-持续更新]
第1部分 跨平台开发体验 1 跨平台开发体验 001 跨平台开发体验: Windows [上篇] 002 跨平台开发体验: Windows [中篇] 003 跨平台开发体 ...
- ASP.NET Core框架揭秘(持续更新中…)
之前写了一系列关于.NET Core/ASP.NET Core的文章,但是大都是针对RC版本.到了正式的RTM,很多地方都发生了改变,所以我会将之前发布的文章针对正式版本的.NET Core 1.0进 ...
- ASP.NET MVC5+EF6搭建三层实例
一.创建项目解决方案 1.model层.BLL层.Dal层.Common层,都是类库 2.UI层使用MVC5 二.使用EF链接数据库 1.创建实体数据模型 2.选择来自数据库EF设计器 3.创建数据库 ...
- 通过阅读ASP.NET MVC5 框架解密 路由的一点心得
路由: 1.在ASP.NET中路由不专属与ASP.NET MVC,因为路由(Route)是在system.web 命名空间下的,所以传统的WebForm也可以使用路由. 2.什么叫做路由 采用某种机制 ...
- [文章汇总]ASP.NET Core框架揭秘[最近更新:2018/10/31]
之前一段时间都在个人公众号账号“大内老A”发布关于ASP.NET Core的系列文章,很多人留言希望能够同步到这里,所以在这里 对这些文章做一个汇总,以便于PC端阅读.如果说微软官方文档主要关于ASP ...
- ASP.NET Core框架揭秘(持续更新中…)
之前写了一系列关于.NET Core/ASP.NET Core的文章,但是大都是针对RC版本.到了正式的RTM,很多地方都发生了改变,所以我会将之前发布的文章针对正式版本的.NET Core 1.0进 ...
- ASP.NET MVC4框架揭秘 源代码下载
http://files.cnblogs.com/artech/asp.net.mvc.4.samples.rar
随机推荐
- ACM: FZU 2102 Solve equation - 手速题
FZU 2102 Solve equation Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & ...
- Python之路第一课Day2--随堂笔记
入门知识拾遗 一.bytes类型 bytes转二进制然后转回来 msg="张杨" print(msg) print(msg.encode("utf-8")) p ...
- CNUOJ 0576 加油
40017074加油 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 你需要驾驶一辆汽车行驶S个单位的距离.最开始汽车上有P个单 ...
- Windows 10 Build 14997中Edge浏览器已默认阻止Flash运行
在上周末偷跑的 Windows 10 Build 14997 向我们传递了很多信息,新增了蓝光过滤器等功能,并有望装备在即将到来的 Creators Update 中.经过深入发掘,外媒发现新版系统中 ...
- virtualenv
问题:python开发过程中,需要安装各类依赖 逐个安装依赖,操作复杂,并可能会出现版本不一致的问题 解决:virtualenv可以有效解决上述问题 使用方法: 安装: pip install vir ...
- JavaScript 入门教程四 语言基础【2】
一.数据类型介绍: undefined null NaN 1.判断当前变量是否为 undefined: if (i === undefined) 或者 if (typeof (i) === " ...
- Python 中的枚举类型~转
Python 中的枚举类型 摘要: 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表 ...
- lvs源代码分析
以linux-2.6.21为例. 数据结构介绍: ip_vs_conn 对于某个连接记录其N元组, (client, vserver, rserver) & (address, port) Q ...
- jquery懒加载jquery.lazyload.js
Lazy Load 是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它们所在的位置. 这与图片预 ...
- margin重叠现象与margin auto自适应居中
上下相邻的(算一种兄弟关系)普通元素,上下边距并非简单的相加,而是取其中最大的边距值:而浮动的盒子边距是相加的:父子div也会发生重叠,并不是bug: <style>#test1{ wid ...