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
随机推荐
- iOS二维码生成-libqrencode编译报错
libqrencode使用 1.将libqrencode文件夹整个拖入项目文件夹中 2.在要生成二维码的页面的 .m文件头部添加 #import "QRCodeGenerator.h&quo ...
- 运用ASP.NET实现
calation.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; /// ...
- *HDU1325 并查集
Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- java并发编程(七)synchronized详解
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized( ...
- 数据字典生成工具之旅(5):DocX组件读取与写入Word
由于上周工作比较繁忙,所以这篇文章等了这么久才写(预告一下,下一个章节正式进入NVelocity篇,到时会讲解怎么使用NVelocity做一款简易的代码生成器,敬请期待!),好了正式进入本篇内容. 这 ...
- Hibernate加载数据失败failed to lazily initialize a collection of role
在测试获取数据库中的数据或者在页面获取时,有时会遇到这样的错误提示: failed to lazily initialize a collection of role: com.exam.entity ...
- Chrome F12学习
Chrome实用调试技巧 Chrome调试工具常用功能整理 Google Chrome开发者工具使用(图文教程) 如何更专业的使用Chrome开发者工具
- WebApp中的页面生命周期及路由管理
最近切换到一个新项目,使用的技术栈是Require+Backbone,鉴于对鞋厂webapp框架的了解,发现这个新项目有些缺陷,主要是单纯依赖Backbone造成的,也就是Backbone的好和坏都在 ...
- erlang文章博客推荐
博客排名不分先后. 诸霸,http://blog.yufeng.info/. 淘宝核心系统资深技术专家,真的是专家,了解erlang已不久局限于erlang,而且现在也一直在更新技术博文,和陈晧一样. ...
- Qt程序打包(使用Enigma Virtual Box和BoxedApp Packer封包)
一.使用单文件封包工具 单文件封包工具,顾名思义就是将可执行文件及其相关依赖打包成单个可执行文件的工具. 这里推荐两个单文件封包工具:Enigma Virtual Box和BoxedApp Packe ...