一、实现Controller的依赖注入:

1.自定义继承DefaultControllerFactory 类的控制器工厂类并重写GetControllerInstance方法;(如:InjectControllerFactory)

2.在Global.asax文件中的Application_Start方法中注册该控制器工厂类,示例如下:

  1. ControllerBuilder.Current.SetControllerFactory(new InjectControllerFactory());

二、在Action方法中添加ActionName特性实现为其指定别名,或者添加NonAction以表明该方法并不会被路由匹配到,可通过继承ActionMethodSelectorAttribute抽象类并重写IsValidForRequest方法实现类似HttpGet、HttpPost、HttpPut、HttpDelete 和 NonAction 等自定义Action方法选择器

三、导步Controller:继承自AsyncController抽象类,并自定义异步Action方法(异步方法有两种:一种是XxxAsync/XxxCompleted,二种是Task返回值),具体实现详见:ASP.NET MVC下的异步Action的定义和执行原理

四、基本过滤器如下,可以通过实现相应接口来自定义过滤器

五、在View上动态添加或处理内容

1.内联代码(代码片段):如 @{ .. }或<% .. %>
2.Html helper方法:生成单个或多个HTML元素,如 Html.Label,Html.Editor等
3.Section:在指定的位置插入创建好的一部分内容(类似ASP.NET PlaceHolder),如 @section sectionName{ ...}
4.Partial view:存在于一个单独的视图文件中,作为子内容可在多个视图中共享,如 Html.Partial、Html.RenderPartial
5.Child action,相当于一个包含了业务逻辑的UI组件。当使用child action时,它调用 controller 中的 action 来返回一个view,并将结果插入到输出流中,如 Html.Action、Html.RenderAction

六、HTML Helper扩展方法:可直接生成相应的HTML元素,主要分为如下几类

1.链接类:在System.Web.Mvc.Html.LinkExtensions静态类包含生成各种链接的扩展方法;
2.表单类:在System.Web.Mvc.Html.FormExtensions静态类包含生成From元素的扩展方法;
3.输入类:在System.Web.Mvc.Html.InputExtensions静态类包含生成各种输入元素的扩展方法;
4.多文本输入类:在System.Web.Mvc.Html.TextAreaExtensions静态类包含生成TextArea元素的扩展方法;
5.选择类:在System.Web.Mvc.Html.SelectExtensions静态类包含生成各种选择元素的扩展方法;
6.动态编辑器模板类:在System.Web.Mvc.Html.EditorExtensions静态类包含依据要指定的类型来动态生成表单成员元素方法;

若要自定义HTML Helper动态编辑器模板类,可按照MVC约定,在 /Views/Shared/EditorTemplates 文件夹下创建相应的局部视图文件,示例代码如下:

  1. //定义的HTML HELPER模板方法:
  2. @model MvcApplication1.Models.Role
  3.  
  4. @Html.DropDownListFor(m => m, new SelectList(Enum.GetNames(Model.GetType()), Model.ToString()))
  5.  
  6. //View中使用:
  7. @model MvcApplication1.Models.User
  8.  
  9. @Html.EditorFor(m => m.Role)

注意:模板类文件名需与成员类型名称相同,或在数据实体类中指定成员使用哪个类型自定义模板(如:[UIHint("Role")])

七、MVC视图中使用AJAX:

1.使用原生的Ajax或第三方类库(如:jQuery.ajax)

2. 使用 MVC Unobtrusive Ajax

A.在Web.config文件中配置启动 Unobtrusive Ajax(默认为启用)

  1. <appSettings>
  2. <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  3. </appSettings>

B.在调用的页面顶部引入相应的JS脚本文件,如下:

  1. <script src="~/Scripts/jquery-1.8.2.min.js"></script>
  2. <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>

C.最后采用Ajax.BeginForm来包裹表单成员,并为Ajax.BeginForm设置相应的参数

整个示例代码如下:

ACTION代码:

  1. public ActionResult Ajax()
  2. {
  3. return View();
  4. }
  5.  
  6. public ActionResult GetPersons(string selectedRole)
  7. {
  8. IEnumerable<Person> persons = new[]{new Person(){FirstName="z", LastName="x",Role=Role.User},
  9. new Person(){FirstName="z1", LastName="x",Role=Role.Admin},
  10. new Person(){FirstName="z2", LastName="x",Role=Role.User},
  11. new Person(){FirstName="z3", LastName="x",Role=Role.Admin},
  12. new Person(){FirstName="z4", LastName="x",Role=Role.User}};
  13.  
  14. if (selectedRole != "All")
  15. {
  16. persons = persons.Where(p => Enum.GetName(typeof(Role), p.Role) == selectedRole);
  17. }
  18.  
  19. return PartialView(persons);
  20.  
  21. }

VIEW代码:

  1. //主视图Ajax
  2.  
  3. <h2>Ajax</h2>
  4.  
  5. <script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
  6. <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
  7.  
  8. <table>
  9. <tbody id="result">
  10.  
  11. </tbody>
  12. </table>
  13.  
  14. @using (Ajax.BeginForm("GetPersons", new AjaxOptions() { UpdateTargetId = "result" }))
  15. {
  16. <div>
  17. @Html.DropDownList("selectedRole", new SelectList(
  18. new[] { "All" }.Concat(Enum.GetNames(typeof(MvcApplication1.Models.Role)))))
  19. <button type="submit">Submit</button>
  20. </div>
  21. }
  22.  
  23. //分部视图:GetPersons
  24. @model IEnumerable<MvcApplication1.Models.Person>
  25.  
  26. @foreach (var p in Model)
  27. {
  28. <tr>
  29. <td>@p.FirstName</td>
  30. <td>@p.LastName</td>
  31. <td>@p.Role</td>
  32. </tr>
  33. }

八、Model Binding(模型绑定): 是 HTTP 请求和 Action 方法之间的桥梁,它根据 Action 方法中的 Model 类型创建 .NET 对象,并将 HTTP 请求的数据经过转换赋给该对象。

A.Model Binder(模型绑定器),顾名思义,可以形象的理解为将数据绑定到一个 Model 的工具。

MVC 框架内置默认的 Model Binder 是 DefaultModelBinder 类。当 Action Invoker 没找到自定义的 Binder 时,则默认使用 DefaultModelBinder。默认情况下,DefaultModelBinder 从如下 4 种途径查找要绑定到 Model 上的值:

Request.Form,HTML form 元素提供的值。
RouteData.Values,通过应用程序路由提供的值。
Request.QueryString,所请求 URL 的 query string 值。
Request.Files,客户端上传的文件。

B.绑定到复合类型(嵌套关联类型、可索引的类型等)需注意视图中表单成员的元素名称name必需符合可关联、可索引,示例如下:

  1. //MODEL
  2. public class Person {
  3. public int PersonId { get; set; }
  4. public string FirstName { get; set; }
  5. public string LastName { get; set; }
  6. public Address HomeAddress { get; set; }
  7. }
  8. public class Address {
  9. public string City { get; set; }
  10. public string Country { get; set; }
  11. }
  12.  
  13. //VIEW
  14. @Html.EditorFor(m=> m.HomeAddress.Country)
  15. //或
  16.  
  17. <input id="HomeAddress_Country" name="HomeAddress.Country" type="text" value="" />
  1. //可索引类型的在VIEW写法
  2. @Html.Editor("[" + i + "].Country")
  3. //或
  4. @Html.EditorFor(m => m[i].Country)
  5. //或
  6. <input name="[0].Country" type="text" value="" />

当然如果不想这么麻烦也可以自己实现ModelBinder 类,然后在ACTION方法中显式指定ModelBinder,如下:

  1. public ActionResult Index([ModelBinder(typeof(CustomerModelBinder))]Person p)
  2. {
  3. return View();
  4. }

 九、Model验证的几种方法:

1.在Action方法中使用 ModelState 对Model对象的属性值自行判断合法性,如:

  1. public ActionResult UpdatePerson(Person p)
  2. {
  3. if (string.IsNullOrEmpty(p.FirstName))
  4. {
  5. ModelState.AddModelError("FirstName", "FirstName is not allow null!");
  6. }
  7.  
  8. if (string.IsNullOrEmpty(p.LastName))
  9. {
  10. ModelState.AddModelError("LastName", "LastName is not allow null!");
  11. }
  12.  
  13. if (ModelState.IsValid)
  14. {
  15. //执行更新
  16. }
  17.  
  18. return View();
  19. }

2.在Model各属性上直接定义验证规则,然后DefaultModelBinder类会自动进行验证,如:

  1. public class Person
  2. {
  3. [Range(1,int.MaxValue)]
  4. public int PersonId { get; set; }
  5.  
  6. [Required(ErrorMessage="请输入姓")]
  7. public string FirstName { get; set; }
  8.  
  9. [Required(ErrorMessage = "请输入名")]
  10. public string LastName { get; set; }
  11.  
  12. [Required(ErrorMessage = "请完整输入地址")]
  13. public Address HomeAddress { get; set; }
  14.  
  15. public Role Role { get; set; }
  16. }

3.通过继承ValidationAttribute抽象类并重写IsValid方法来自定义验证特性类(如下示例),然后使用方法与方法2相同

  1. public class MailAttribute:ValidationAttribute
  2. {
  3. public override bool IsValid(object value)
  4. {
  5. if(value==null) return false;
  6. var regex = new System.Text.RegularExpressions.Regex(@"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
  7. return regex.IsMatch(value.ToString());
  8. }
  9. }
  10.  
  11. //MODEL的某个属性设置:
  12.  
  13. [Mail(ErrorMessage="不是有效的电子邮箱地址")]
  14. public string EMail { get; set; }

4.MODEL自验证:让MODEL类实现IValidatableObject接口,在Validate方法进行验证判断,然后DefaultModelBinder类会自动进行验证,如:

  1. public class Computer:IValidatableObject
  2. {
  3. public string CPU { get; set; }
  4.  
  5. public string MB { get; set; }
  6.  
  7. public string MEM { get; set; }
  8.  
  9. public string HDD { get; set; }
  10.  
  11. public string Power { get; set; }
  12.  
  13. public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
  14. {
  15. var errors=new List<ValidationResult>();
  16. if (string.IsNullOrEmpty(CPU))
  17. {
  18. errors.Add(new ValidationResult("CPU is not allow null!"));
  19. }
  20. if (string.IsNullOrEmpty(MB))
  21. {
  22. errors.Add(new ValidationResult("MB is not allow null!"));
  23. }
  24.  
  25. if (string.IsNullOrEmpty(MEM))
  26. {
  27. errors.Add(new ValidationResult("MEM is not allow null!"));
  28. }
  29.  
  30. if (string.IsNullOrEmpty(Power))
  31. {
  32. errors.Add(new ValidationResult("Power is not allow null!"));
  33. }
  34.  
  35. return errors;
  36. }
  37. }

以上验证默认是在提交到服务器端后再进行的验证,也可以开启客户端验证或远程验证(实现原理都是基于AJAX),在此不再说明。

ASP.NET MVC必知必会知识点总结(二)的更多相关文章

  1. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  2. 关于TCP/IP,必知必会的十个经典问题[转]

    关于TCP/IP,必知必会的十个问题 原创 2018-01-25 Ruheng 技术特工队   本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. 一 ...

  3. Android程序员必知必会的网络通信传输层协议——UDP和TCP

    1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...

  4. 《MySQL必知必会》整理

    目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...

  5. 迈向高阶:优秀Android程序员必知必会的网络基础

    1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用 ...

  6. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

  7. TCP/IP 必知必会的十个问题

    本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. 一.TCP/IP模型 TCP/IP协议模型(Transmission Control Protoc ...

  8. mysql 必知必会总结

    以前 mysql 用的不是很多, 2 天看了一遍 mysql 必知必会又复习了一下基础.  200 页的书,很快就能看完, 大部分知识比较基础, 但还是了解了一些以前不知道的知识点.自己做一个备份,随 ...

  9. 读《MySQL必知必会》我学到了什么?

    前言 最近在写项目的时候发现自己的SQL基本功有些薄弱,遂上知乎查询MYSQL关键字,期望得到某些高赞答案的指点,于是乎发现了 https://www.zhihu.com/question/34840 ...

  10. 第5节:Java基础 - 必知必会(下)

    第5节:Java基础 - 必知必会(下) 本小节是Java基础篇章的第三小节,主要讲述Java中的Exception与Error,JIT编译器以及值传递与引用传递的知识点. 一.Java中的Excep ...

随机推荐

  1. android oauth 微博客户端 架构一

    最近研究oauth协议,为了进一步 的巩固自己的学习成果,顾完成了android的新浪客户端.他的架构如下: UI层微博中的各个窗体  就是所谓的各个activitylogic层程序的核心控制调度模块 ...

  2. 分布式系统一致性问题和Raft一致性算法

    一致性问题 一致性算法是用来解决一致性问题的,那么什么是一致性问题呢? 在分布式系统中,一致性问题(consensus problem)是指对于一组服务器,给定一组操作,我们需要一个协议使得最后它们的 ...

  3. [.net 面向对象编程基础] (8) 基础中的基础——修饰符

    [.net 面向对象编程基础] (8) 基础中的基础——修饰符 在进入C#面向对象核心之前,我们需要先对修饰符有所了解,其实我们在前面说到变量和常量的时候,已经使用了修饰符,并且说明了变量和常量的修改 ...

  4. Devexpress 等待窗体

    加载窗体以及等待窗体 程序加载时,需要等待加载完成后在显示 窗体显示顺序 1. 给用户看的等待窗体 2. 加载完成后的主窗体 代码如下: 1. 等待窗体代码 #region using using S ...

  5. C-Lodop 非典型应用

    Lodop是什么? 有人说她是报表打印工具,因为那个add_print_table语句把报表统计的那点事弄了个明明白白: 有人说她是条码打印工具,因为用了她再也不用后台生成条码图片了,前端一行指令就动 ...

  6. ASP.net状态服务器使用

    最近在开发一.NET4.0系统时经常发生session丢失问题,导致用户频繁登陆,给客户造成不良的用户体验.应项目经理号召尽快解决此问题. 一.问题描述. 服务器:windows server 200 ...

  7. 纯CSS实现3D按钮效果

    今天分享一个用纯CSS实现的3D按钮.css巧妙利用了box-shadow来实现3D物体的立体感,当按钮按下的时候再去修改box-shadow和top值.让人感觉有一种按钮被按下的感觉.css代码非常 ...

  8. [源码解析]HashMap和HashTable的区别(源码分析解读)

    前言: 又是一个大好的周末, 可惜今天起来有点晚, 扒开HashMap和HashTable, 看看他们到底有什么区别吧. 先来一段比较拗口的定义: Hashtable 的实例有两个参数影响其性能:初始 ...

  9. [Java面试六]SpringMVC总结以及在面试中的一些问题.

    1.简单的谈一下SpringMVC的工作流程? 流程 1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理 ...

  10. webpack配置es6开发环境

    webpack.config.js var path = require('path'); module.exports = { entry: "./es6/demo01.js", ...