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
随机推荐
- 我JSP学习心得1
老师布置了一项作业,说是要按着老师的要求写,但我觉得只要是技术分享的心得就是好的,不论是不是所要求的内容. 由于和几个人在外面给别人搭建网站,项目需要学习了jsp有用到了javascript,这里有一 ...
- CSS常用属性
//边界线 border: 1px solid #E4E4E4; //绝对 定位 position: absolute; //相对定位 position: relative; //超出部分隐藏 ove ...
- 自定义一个字母Button
package com.example.administrator.yunstore.widget; import android.content.Context; import android.gr ...
- jenkins,dns错误log过大
http://stackoverflow.com/questions/31719756/how-to-stop-jenkins-log-from-becoming-huge Recently my j ...
- jcl-over-slf4j log桥接工具简介
ava 界里有许多实现日志功能的工具,最早得到广泛使用的是 log4j,许多应用程序的日志部分都交给了 log4j,不过作为组件开发者,他们希望自己的组件不要紧紧依赖某一个工具,毕竟在同一个时候还有很 ...
- htmlentities,html_entity_decode,addslashes
PHP htmlspecialchars_decode() 函数 PHP htmlspecialchars() 函数 PHP html_entity_decode() 函数 PHP中混淆的三组函数总结 ...
- tshark 抓包分析
一,安装#yum install -y wireshark 二.具体使用案例 1.抓取500个包,提取访问的网址打印出来tshark -s 0 -i eth0 -n -f 'tcp dst port ...
- IOS 开发教程
http://www.raywenderlich.com/category/ios http://www.raywenderlich.com/50310/storyboards-tutorial-in ...
- Image模块
1.创建一个新的图片 Image.new(mode,size) Image.new(mode,size,color) 2.层叠图片 层叠两个图片,img1和img2,alpha是一个介于[0,1]的浮 ...
- wordpres 自定义comment样式
http://wange.im/diy-wordpress-comment-style.html function mytheme_comment($comment, $args, $depth) { ...