一、实现Controller的依赖注入:

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

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

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 文件夹下创建相应的局部视图文件,示例代码如下:

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

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

七、MVC视图中使用AJAX:

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

2. 使用 MVC Unobtrusive Ajax

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

    <appSettings> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> </appSettings> 

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

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

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

整个示例代码如下:

ACTION代码:

        public ActionResult Ajax(){return View();}public ActionResult GetPersons(string selectedRole){IEnumerable<Person> persons = new[]{new Person(){FirstName="z", LastName="x",Role=Role.User},new Person(){FirstName="z1", LastName="x",Role=Role.Admin},new Person(){FirstName="z2", LastName="x",Role=Role.User},new Person(){FirstName="z3", LastName="x",Role=Role.Admin},new Person(){FirstName="z4", LastName="x",Role=Role.User}};if (selectedRole != "All"){persons = persons.Where(p => Enum.GetName(typeof(Role), p.Role) == selectedRole);}return PartialView(persons);}

VIEW代码:

//主视图Ajax<h2>Ajax</h2><script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script><table><tbody id="result"></tbody>
</table>@using (Ajax.BeginForm("GetPersons", new AjaxOptions() { UpdateTargetId = "result" }))
{<div>@Html.DropDownList("selectedRole", new SelectList(new[] { "All" }.Concat(Enum.GetNames(typeof(MvcApplication1.Models.Role)))))<button type="submit">Submit</button></div>
}//分部视图:GetPersons
@model IEnumerable<MvcApplication1.Models.Person>@foreach (var p in Model)
{<tr><td>@p.FirstName</td><td>@p.LastName</td><td>@p.Role</td></tr>
}

八、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必需符合可关联、可索引,示例如下:

//MODEL
public class Person { public int PersonId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public Address HomeAddress { get; set; }
}
public class Address { public string City { get; set; } public string Country { get; set; }
}//VIEW
@Html.EditorFor(m=> m.HomeAddress.Country)
//或<input id="HomeAddress_Country" name="HomeAddress.Country" type="text" value="" />

//可索引类型的在VIEW写法
@Html.Editor("[" + i + "].Country")
//或
@Html.EditorFor(m => m[i].Country)
//或
<input   name="[0].Country" type="text" value="" />

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

        public ActionResult Index([ModelBinder(typeof(CustomerModelBinder))]Person p){return View();}

 九、Model验证的几种方法:

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

        public ActionResult UpdatePerson(Person p){if (string.IsNullOrEmpty(p.FirstName)){ModelState.AddModelError("FirstName", "FirstName is not allow null!");}if (string.IsNullOrEmpty(p.LastName)){ModelState.AddModelError("LastName", "LastName is not allow null!");}if (ModelState.IsValid){ //执行更新}return View();}

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

    public class Person{[Range(1,int.MaxValue)]public int PersonId { get; set; }[Required(ErrorMessage="请输入姓")]public string FirstName { get; set; }[Required(ErrorMessage = "请输入名")]public string LastName { get; set; }[Required(ErrorMessage = "请完整输入地址")]public Address HomeAddress { get; set; }public Role Role { get; set; }}

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

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

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

    public class Computer:IValidatableObject{public string CPU { get; set; }public string MB { get; set; }public string MEM { get; set; }public string HDD { get; set; }public string Power { get; set; }public IEnumerable<ValidationResult> Validate(ValidationContext validationContext){var errors=new List<ValidationResult>();if (string.IsNullOrEmpty(CPU)){errors.Add(new ValidationResult("CPU is not allow null!"));}if (string.IsNullOrEmpty(MB)){errors.Add(new ValidationResult("MB is not allow null!"));}if (string.IsNullOrEmpty(MEM)){errors.Add(new ValidationResult("MEM is not allow null!"));}if (string.IsNullOrEmpty(Power)){errors.Add(new ValidationResult("Power is not allow null!"));}return errors;}}

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

转载于:https://www.cnblogs.com/zuowj/p/4772709.html

ASP.NET MVC必知必会知识点总结(二)相关推荐

  1. MySQL“必知必会”的知识点

    MySQL"必知必会"的知识点 From 2017-02-16 陈小兵 51CTO博客 MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在 ...

  2. 【软考系统架构设计师】第八章 Web架构(知识点必知必会)

    [软考系统架构设计师]第八章 Web架构(知识点必知必会) 第八章 Web架构(知识点必知必会) [软考系统架构设计师]第八章 Web架构(知识点必知必会) 一. 负载均衡与集群技术 1)什么是负载均 ...

  3. 【软考系统架构设计师】知识点必知必会系列汇总

    [软考系统架构设计师]知识点必知必会系列汇总 章节号 章节名 链接 第一章 安全性和保密性设计 https://blog.csdn.net/Last_Impression/article/detail ...

  4. asp sql ip地址排序_SQL必知必会读书笔记,30分钟入门SQL!

    点击上方SQL数据库开发,关注获取SQL视频教程 SQL专栏 SQL数据库基础知识汇总 SQL数据库高级知识汇总 来源:https://segmentfault.com/p/1210000011760 ...

  5. Java架构师必知必会,带走不谢

    可以说,Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地. 成为Java架构师,需要掌握哪些技能呢 ...

  6. mysql必知必会_《MySQL必知必会》学习小结

    关于SQL,之前通过sqlzoo的题目,完成了入门,也仅仅是入门而已. 最近都在忙着投简历和找新的数据分析项目做(为了练python和面试的时候有的聊),所以SQL放了一段时间没练.目前的工作用不到, ...

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

    为什么80%的码农都做不了架构师?>>>    本文原作者:"竹千代",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说&q ...

  8. java的标量和聚合量_第5节:Java基础 - 必知必会(下)

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

  9. 《MySQL必知必会》所有SQL语句图表集合(可作为查询表使用)---已完结

    本篇文章是对<MySQL必知必会>所有语句知识点的图表集合,适合快速查询遗忘的SQL语句. 本文的脉络结构,首先先给出<MySQL必知必会>的目录和本书中用到的数据表的UML图 ...

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

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

最新文章

  1. 《Revisiting Salient Object Detection! Simultaneous Detection, Ranking, and Subitizing of Multiple Sa
  2. Spring Security 源码分析:Spring Security 授权过程
  3. 计算机系统集成项目的管理及应用
  4. Keras实现mode.fit和model.fit_generator比较
  5. Hanlder Looper MessageQueue Message
  6. 细丝极恐的华为251事件
  7. eclipse run on server 点不了finish_分享点经验 | springboot入门及编码
  8. 问题:AmqpConnectException: java.net.ConnectException: Connection refused: connect
  9. Java Web学习总结(18)——JSP标签
  10. Mybatis数据库连接报错:对实体 “characterEncoding“ 的引用必须以 ‘;‘ 分隔符结尾
  11. matlab之svd、svds函数
  12. Perforce client - p4常见用法
  13. 图片存储解决方案--阿里云OSS
  14. ftp服务器软件,推荐几款免费的ftp服务器软件,ftp客户端下载
  15. Hackintosh_guide黑苹果
  16. 计算机考研用python_2014北邮计算机考研复试上机题解(上午+下午)
  17. 【毕业设计项目】基于ESP32的家庭气象站系统 - stm32 物联网 嵌入式 单片机
  18. Unity3d 与罗技G29交互
  19. bootstrap之data-toggle,data-dismiss,data-target用法
  20. 谷传民对战大衣哥,和合国际收购《火火的情怀》后孟文豪新曲上线

热门文章

  1. el-table表格fixed=“right“后表格错乱;Safari浏览器el-table表格错乱;Safari浏览器样式需改无效;
  2. vue-cli3项目通过vue如何引入第三方js包完成登陆功能
  3. 前端小知识点(1):undefined和null区别
  4. react学习(67)--git 屏蔽文件不被追踪
  5. 前端学习(3155):react-hello-react之脚手架文件_public
  6. PS教程第二十三课:套索工具
  7. 前端学习(2740):重读vue电商网站50之Element-UI 组件按需加载
  8. 前端学习(2567):指令的本质
  9. “约见”面试官系列之常见面试题之第七十三篇之js文件中import中加{}和不加{}的区别(建议收藏)
  10. 前端学习(1713):前端系列javascript之运行