Asp.net MVC5 框架是个 开源的,处处可扩展的框架。

蒋先生 在他的这本书里 对如何理解框架,如何扩展框架, 给出了大量的说明和实例。

先上效果图

大部分做传统BS 的同学看到这个页面,脑海里的第一反应 就是一堆HTML 一堆控件 然后 后台绑定什么的吧。

但请看页面的代码。

  1. @model MvcApp.Models.Employee
  2. <html>
  3. <head>
  4.     <title>编辑员工信息</title>
  5. </head>
  6. <body>
  7.     <table>
  8.         <tr>
  9.             <td>@Html.LabelFor(m => m.Name)</td>
  10.             <td>
  11.                 @Html.EditorFor(m => m.Name)
  12.             </td>
  13.         </tr>
  14.         <tr>
  15.             <td>@Html.LabelFor(m => m.Gender)</td>
  16.             <td>
  17.                 @Html.EditorFor(m => m.Gender)
  18.             </td>
  19.         </tr>
  20.         <tr>
  21.             <td>@Html.LabelFor(m => m.Education)</td>
  22.             <td>
  23.                 @Html.EditorFor(m => m.Education)
  24.             </td>
  25.         </tr>
  26.         <tr>
  27.             <td>@Html.LabelFor(m => m.Departments)</td>
  28.             <td>
  29.                 @Html.EditorFor(m => m.Departments)
  30.             </td>
  31.         </tr>
  32.         <tr>
  33.             <td>@Html.LabelFor(m => m.Skills)</td>
  34.             <td>
  35.                 @Html.EditorFor(m => m.Skills)
  36.             </td>
  37.         </tr>
  38.     </table>
  39. </body>
  40. </html>

怎么做的呢? 这个MvcApp.Models.Employee 又是什么呢?为什么会很神奇的变成一堆 各种各样的 list 控件呢?

  1. namespace MvcApp.Models
  2. {
  3.     public class Employee
  4.     {
  5.         [DisplayName("姓名")]
  6.         public string Name { get; set; }
  7.  
  8.         [RadioButtonList("Gender")]
  9.         [DisplayName("性别")]
  10.         public string Gender { get; set; }
  11.  
  12.         [DropdownList("Education")]
  13.         [DisplayName("学历")]
  14.         public string Education { get; set; }
  15.  
  16.         [ListBox("Department")]
  17.         [DisplayName("所在部门")]
  18.         public IEnumerable<string> Departments { get; set; }
  19.  
  20.         [CheckBoxList("Skill")]
  21.         [DisplayName("擅长技能")]
  22.         public IEnumerable<string> Skills { get; set; }
  23.     }
  24. }

看到这里对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 有如下区别。

  1. "" 参数
  2. <tr>
  3.    <td><label for="Education">学历</label></td>
  4.    <td>
  5.      <select id="Education" name="Education"><option value="H">高中</option>
  6.        <option value="B">大学本科</option>
  7.        <option selected="selected" value="M">硕士</option>
  8.        <option value="D">博士</option>
  9.      </select>
  10.    </td>
  11. </tr>
  12. "Test" 参数
  13. <tr>
  14.    <td><label for="Education">学历</label></td>
  15.    <td>
  16.      <select id="Education_test" name="Education.test"><option value="H">高中</option>
  17.      <option value="B">大学本科</option>
  18.      <option selected="selected" value="M">硕士</option>
  19.      <option value="D">博士</option>
  20.      </select>
  21.    </td>
  22. </tr>

具体为何会有如上区别,请去研究代码看书吧。

玩Asp.net MVC 的同学 你真的发挥出 Asp.net MVC 这个框架的强大威力了么?

Asp.net MVC5 框架揭秘 S412 实例解析 – 绝妙的扩展 模式的胜利的更多相关文章

  1. ASP.NET MVC5框架揭秘 学习笔记01

    1.自治视图 在早期(作者也没说明是多早,自己猜吧),我们倾向于将所有与UI相关的操作糅合在一起(现在我身边还有很多人这样做),这些操作包括UI界面的呈现. 用户交互操作的捕捉与响应(UI处理逻辑). ...

  2. [ASP.NET Core 3框架揭秘] 依赖注入[3]:依赖注入模式

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架之中以实现对流程的复用,并按照"好莱坞法则"实现应用程序的代码与框架之间的交互.我们可以采用若干设计模式 ...

  3. ASP.NET Core框架揭秘[博文汇总-持续更新]

    第1部分 跨平台开发体验 1 跨平台开发体验 001 跨平台开发体验: Windows [上篇]         002 跨平台开发体验: Windows [中篇]        003 跨平台开发体 ...

  4. ASP.NET Core框架揭秘(持续更新中…)

    之前写了一系列关于.NET Core/ASP.NET Core的文章,但是大都是针对RC版本.到了正式的RTM,很多地方都发生了改变,所以我会将之前发布的文章针对正式版本的.NET Core 1.0进 ...

  5. ASP.NET MVC5+EF6搭建三层实例

    一.创建项目解决方案 1.model层.BLL层.Dal层.Common层,都是类库 2.UI层使用MVC5 二.使用EF链接数据库 1.创建实体数据模型 2.选择来自数据库EF设计器 3.创建数据库 ...

  6. 通过阅读ASP.NET MVC5 框架解密 路由的一点心得

    路由: 1.在ASP.NET中路由不专属与ASP.NET MVC,因为路由(Route)是在system.web 命名空间下的,所以传统的WebForm也可以使用路由. 2.什么叫做路由 采用某种机制 ...

  7. [文章汇总]ASP.NET Core框架揭秘[最近更新:2018/10/31]

    之前一段时间都在个人公众号账号“大内老A”发布关于ASP.NET Core的系列文章,很多人留言希望能够同步到这里,所以在这里 对这些文章做一个汇总,以便于PC端阅读.如果说微软官方文档主要关于ASP ...

  8. ASP.NET Core框架揭秘(持续更新中…)

    之前写了一系列关于.NET Core/ASP.NET Core的文章,但是大都是针对RC版本.到了正式的RTM,很多地方都发生了改变,所以我会将之前发布的文章针对正式版本的.NET Core 1.0进 ...

  9. ASP.NET MVC4框架揭秘 源代码下载

    http://files.cnblogs.com/artech/asp.net.mvc.4.samples.rar

随机推荐

  1. PHP生成验证码及单实例应用

    /* note: * this 指向当前对象本身 * self 指向当前类 * parent 指向父类 */ /* 验证码工具类 * @author pandancode * @date 20150- ...

  2. 基于华清远见STM32f051的 IIC从模式实现方法

    作者:卢老师,华清远见嵌入式学院讲师. 在大多情况下,我们使用MCU控制传感器,节点以及相关从设备,但在较为复杂的系统中,有时候也会使用MCU做为从设备. 下面是关于stm32f051的从模式实现方法 ...

  3. Python标准异常topic

    Python标准异常topic AssertionError                            断言语句 (assert)                              ...

  4. JS base64 加密和 后台 base64解密(防止中文乱码)

    直接上代码 1,js(2个文件,网上找的)  不要觉的长,直接复制下来就OK //UnicodeAnsi.js文件 //把Unicode转成Ansi和把Ansi转换成Unicode function ...

  5. EasyTouch绑定事件在电脑上点击有效Android上无效的解决方法

    最近做一个RPG类的游戏发现使用EasyTouch虚拟摇杆插件在电脑上点击有效Android上无效,查找资料发现是Easy Joystick中的一个属性interaction type要设置成 Dir ...

  6. 諾基亞定制的Android系統名為 Z Launcher

    N1這款產品似乎沒有諾基亞的傳統風格,搭載Android系統以及酷似iPad mini的外觀,都在向外界傳遞著一個信號:諾基亞在變化.不過,沒有了移動設備部門的諾基亞,仍然心系消費電子市場,N1會是個 ...

  7. 20145205 《Java程序设计》第6周学习总结

    教材学习内容总结 -若要将数据从来源中取出,可以使用输入串流:若要将数据写入目的地,可以使用输出串流.在java中,输入串流代表对象为java.in.InputStream的实例:输出串流代表对象为j ...

  8. linux系统安装(下)

    Grub引导装载程序 目录简单介绍 /dev存放了设备文件  /dev/sad硬盘文件  root/install.log安装日志  root/kickstart包含这次安装信息,下次若需要相同安装可 ...

  9. PHP 接入芝麻信用 注意 事项

    芝麻官方下载的SDK,跑不起来,百度搜索一番也没有发现太多的文章 ,只有一个CSDN博客写的一篇文章,比较有参考价值 详细查阅文档+几天测试整理以下几点注意事项: 接入芝麻API接口,应该分2步: 第 ...

  10. 3.线性表-cursor

    fatal.h #include <stdio.h> #include <stdlib.h> #define Error( Str ) FatalError( Str ) #d ...