Asp.net mvc 培训

907 views

Published on

ASP.NET MVC 培训

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
907
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
9
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Asp.net mvc 培训

  1. 1. ASP.NET MVC 培训 深圳市国泰安信息技术有限公司 Daniel Chow http://www.cnblogs.com/DanielChow
  2. 2. ASP.NET MVC 的基本概念 提 纲 基础介绍 HtmlHelper ,UrlHelper, Filter Url Routing and Test Tool Data Annotations and Validation Controller 和 View 之间的数据传输 ASP.NET MVC 生命周期 AJAX & Unobtrusive Javascript 问答 (QA)
  3. 3. ASP.NET MVC 的基本概念 MVC ( Model-View-Controller ,模型—视图—控制器模式)用于表示一种软件架构模式。它把软件系统分为三个基本部分:模型( Model ),视图( View )和控制器( Controller )。 MVC 本身是一种模式 , 它的核心思想是:把一个应用的输入、处理、输出流程按照 Model 、 View 、 Controller 的方式进行分离 我们今天讨论的 ASP.NET MVC , 是微软的一个开源产品 , 后续的讨论基于 ASP.NET MVC 3.0 版本 . 在 ASP.NET MVC 中的 MVC ,我的理解是一种表现层的 MVC 模式 , 也就是传统三层架构的 UI 层 .
  4. 4. <ul><li>Model , 这里是 View Model 和三层中的 Domain Model 区分开来 , 它给 View 提供数据,还提供其它一些特性 , 用来支持 Data Annotations and Validation( 后面会讨论 ) , 当然这一层背后应该数据业务层的支持 </li></ul><ul><li>Controller , 处理用户请求 / 操作和输出响应 ,( 接收客户端的输入数据 , 相应的数据过滤 , 控制视图的显示 ) 这一层的独立具有很多意义 , 和传统的 WebForm 相比它不依赖与 View, 也就支持 Test-Driven Development 了。 </li></ul><ul><li>View , 显示数据和用来做用户操作 UI 的,它的显示是由 Controller 来控制的 . </li></ul>
  5. 6. ASP.NET MVC 生命周期
  6. 9. 基础介绍 <ul><li>Demo1 演示 </li></ul>1 、有两个视图引擎 ASPX 和 Razor , 他们的区别在于 View 层的 Server side 代码写法不同, Razor 的写法更简洁和优雅,然后为了区分开他们的文件扩展名不同 . 2 、自定义 HtmlHelper: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.WebPages.Html; namespace System.Web.Mvc { public static class HtmlHelperExtensions { public static string StyleText (this HtmlHelper htmlHelper , string text ,string styleName) { return string.Format(&quot;<span class='{1}'>{0}</span>&quot;, text, styleName); } } }
  7. 10. <ul><li>4 中基本 Filter 类型 IActionFilter, IAuthorizationFilter, IResultFilter, IExceptionFilter </li></ul>他们的执行顺序请看 Demo
  8. 11. Controller 和 View 之间的数据传输 与传统 WebForm 差别较大 , 从生命周期图上就可以看出 ASP.NET MVC 提供两种传值方法: 1 、 TempData[“Test”] 一次性的只能传递到下一个 View 2 、 ViewData[“Test”] 3 、 ViewBag .Test 等价于 2 , 写法不同而已 , 看起来是强类型,其实是动态类型 Controller: ViewData[&quot;Test&quot;] = DateTime.Now.ToString(); TempData[&quot;TempTest&quot;] = DateTime.Now.ToString(); ViewBag.TestBag = DateTime.Now.ToString(); View(Razor): @ViewData[&quot;Test&quot;]<br /> @TempData[&quot;TempTest&quot;]<br /> @ViewBag.TestBag<br />
  9. 12. Data Annotations and Validation <ul><li>Demo </li></ul>
  10. 13. AJAX & Unobtrusive Javascript 当打开 ClientValidationEnabled 之后,会自动产生客户端验证代码 : 产生的代码分两种: 1 、基于 MicrosoftAjax 的,会在页面中产生相应的验证脚本 2 、基于 Jquery 的 Unobtrusive Script 方式进行验证 , 需要打开 UnobtrusiveJavaScriptEnabled 验证的依据就是 View Model 上定义的约束 . 上一节提到的。 当然你还可以自己手写脚本进行验证。 Jquery AJAX 和 Controller 交付 : Controller: public ActionResult GetVersion() { var version = new { Main = 6 , Second = 4, Fix = 3, Build = 235 }; return Json(version);//,JsonRequestBehavior.AllowGet); }
  11. 14. <ul><li>< div id=&quot;footer“>Demo Version:< span id=&quot;version&quot;></ span ></ div > < script type=&quot;text/javascript&quot;> </li></ul><ul><li>String.prototype.JsonFormat = function (config, reserve) { return this.replace(/{([^}]*)}/g, (typeof config == 'object') ? function (m, i) { var ret = config[i]; return ret == null && reserve ? m : ret } : config); }; </li></ul><ul><li>$(function () { </li></ul><ul><li>$.ajax({ </li></ul><ul><li>type: &quot;POST&quot;, </li></ul><ul><li>url: '/Public/GetVersion', </li></ul><ul><li>//data: {}, </li></ul><ul><li>dataType: &quot;json&quot;, </li></ul><ul><li>cache: true, </li></ul><ul><li>success: function (data) { </li></ul><ul><li>$(&quot;#version&quot;).text(&quot;{Main}.{Second}.{Fix}.{Build}&quot;.JsonFormat(data)); </li></ul><ul><li>}, </li></ul><ul><li>error: function (XMLHttpRequest, textStatus, errorThrown) { </li></ul><ul><li>$(&quot;#version&quot;).text(&quot;0.0.0.0&quot;); </li></ul><ul><li>} </li></ul><ul><li>}); </li></ul><ul><li>}); </li></ul><ul><li></ script > </li></ul>
  12. 15. Url Routing and Test Tool <ul><li>首页地址是 : localhost/home/index </li></ul><ul><li>我们发现访问上面的地址 , 最后会传递给 HomeController 中名为 index 的 action( 即 HomeController 类中的 index 方法 ). </li></ul><ul><li>在 global.asax 中 : </li></ul>protected void Application_Start() { AreaRegistration .RegisterAllAreas(); // 注册所有的域 RegisterGlobalFilters( GlobalFilters .Filters); // 注册全局的 fileter RegisterRoutes( RouteTable .Routes); // 注册路由规则 //RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);// 路由调试工具 } public static void RegisterRoutes( RouteCollection routes) { routes.IgnoreRoute( &quot;{resource}.axd/{*pathInfo}&quot; ); routes. MapRoute ( &quot;Default&quot; , // 路由名称 &quot;{controller}/{action}/{id}&quot; , // 带有参数的 URL new { controller = &quot;Home&quot; , action = &quot;Index&quot; , id = UrlParameter .Optional } // 参数默认值 ); }
  13. 16. MapRoute(   string   name,   string   url); MapRoute(   string   name,   string   url,   object   defaults); MapRoute(   string   name,   string   url,   string []   namespaces); MapRoute(   string   name,   string   url,   object   defaults,   object   constraints); MapRoute(   string   name,   string   url,   object   defaults,   string []   namespaces); MapRoute(   string   name,   string   url,   object   defaults,   object   constraints,   string []   namespaces); defaults 参数 :    url 参数的默认值 . 如果一个 url 只有 controller: localhost/home/   而且我们只建立了一条 url 获取数据规则 : {controller}/{action}   那么这时就会为 action 参数设置 defaults 参数中规定的默认值 . defaults 参数是 Object 类型 , 所以可以传递一个匿名类型来初始化默认值 : new   {   controller   =   &quot;Home&quot;,   action   =   &quot;Index&quot;   }   实例中使用的是三个参数的 MapRoute 方法 :        routes.MapRoute (          “ Default” ,                                 “ {controller}/{action}/{id}” ,                         new   {   controller   =   “ Home” ,   action   =   “ Index” ,   id   =   “”   }          );
  14. 17. constraints 参数 :   用来限定每个参数的规则或 Http 请求的类型 .constraints 属性是一个 RouteValueDictionary 对象 , 也就是一个字典表 , 但是这个字典表的值可以有两种 :   用于定义正则表达式的字符串。正则表达式不区分大小写。   一个用于实现 IRouteConstraint 接口且包含 Match 方法的对象。   通过使用正则表达式可以规定参数格式 , 比如 controller 参数只能为 4 位数字 : new   {   controller   =   @&quot;d{4}&quot;}     通过第 IRouteConstraint 接口目前可以限制请求的类型 . 因为 System.Web.Routing 中提供了 HttpMethodConstraint 类 , 这个类实现了 IRouteConstraint 接口 . 我们可以通过为 RouteValueDictionary 字典对象添加键为 &quot;httpMethod&quot;, 值为一个 HttpMethodConstraint 对象来为路由规则添加 HTTP 谓词的限制 , 比如限制一条路由规则只能处理 GET 请求 : httpMethod   =   new   HttpMethodConstraint(   &quot;GET&quot;,   &quot;POST&quot;   )   完整的代码如下 :        routes.MapRoute(          “ Default” ,                                  “ {controller}/{action}/{id}” ,                         new   {   controller   =   “ Home” ,   action   =   “ Index” ,   id   =   “”   },            new   {   controller   =   @“d{4}&quot;   ,   httpMethod   =   new   ttpMethodConstraint(   &quot;GET&quot; ,   &quot;POST&quot;   )   }        );
  15. 18. 路由规则多了之后很容易造成混淆,如何知道是被那一条路由规则被执行了呢? 这里介绍一个路由调试工具: RouteDebug 使用很简单,添加引用然后 , Application_Start 中追加一行代码: RouteDebug. RouteDebugger .RewriteRoutesForTesting( RouteTable .Routes); // 路由调试工具 效果如下:
  16. 20. <ul><li>Area( 域 ) </li></ul><ul><li>Area 是从 MVC 2 开始引入的,它的作用 : </li></ul><ul><li>允许你从功能层面拆分 Models,Views,Controllers, 进一步体现模块化的思想,有助于大项目的管理 </li></ul><ul><li>Demo 演示 </li></ul><ul><li>路由规则注意事项: </li></ul><ul><li>要明确间隔符 eg: {controller} / {action} / {id} , {controller}{action}{id} </li></ul><ul><li>尽量明确参数类型 , 加上参数约束 </li></ul><ul><li>路由注册是有顺序的 . 一般来说路由规则范围越小越精确的越靠前,越通用越靠后。 </li></ul><ul><li>添加 Area 之后很可能会引起 Area Routing 冲突,如果外面有 Home/index 域里面也有 Home/index 这个时候需要在路由注册时加上名词空间加以区别 . </li></ul>
  17. 21. 问答 (QA)& 资料推荐 <ul><li>ASP.NET MVC CodePlex 地址 http://aspnet.codeplex.com/wikipage?title=MVC&referringTitle=Home </li></ul><ul><li>入门与实战推荐学习项目 Nerd Dinner , 有兴趣深入研究推荐学习 MvcContrib 、 Orchard 等项目 </li></ul>

×