切换导航
{{systemName}}
{{ info.Title }}
{{info.Title}}
{{ menu.Title }}
{{menu.Title}}
登录
|
退出
搜索
秘籍列表
ASP.NET基础及企业项目应用
必备工具的安装及C#基础的介绍
ASP.NET高级
数据库操作
Web前端基础
ASP.NET建站核心
ASP.NET MVC
.Net项目
ASP.NET 数据库及各种ORM使用教程
面试
ASP.NET MVC
[TOC] 课前预热:我想首先和大家谈谈为什么我不讲桌面开发,这一方面Asp.net不是一直属于强项吗?传统的桌面开发已经日渐没有市场了。虽然我也做了一年多的桌面开发,现在不也转向网站开发了吗?我们学习一个技术,首先看市场,其次看趋势。如今Asp.net开发已经从古老的WebFrom到现在的Asp.net MVC和目前微软主推的跨平台.Net Core及Lunix系统使用配置,再就是便于部署扩展的微服务等等,包括后期趋势性的语言都是需要我们去掌握的。我也会及时更新课程,分享新技术给大家。好了不扯皮了,开始讲课。 ####第一节Asp.Net MVC介绍 #####1、MVC是什么 MVC是一种设计模式。 也就是Model-View-Controller 模型-视图-控制器。我们可以认为它是UI端分层的三层模式。 #####2、MVC各部分功能介绍 (1)Model的功能 Model是数据模型,用来封装与程序相关的数据,以及对数据操作的处理方法。 比如:数据库的访问操作(增删改查)。 Model不依赖View或Controller,只需要关注数据责任。 常见的技术有:Entity Framework(EF)、Nhibernate、LINQ、DataSet、ADO.NET。 注:由于我们做的大型网站开发数据操作会分成多个层,所以这个Model层在大项目中通常被我们舍弃了。 (2)View的功能 页面显示或者页面回传的部分都属于View, View负责将Controller传过来的数据配合逻辑呈现给用户。 View需要显示给用户的数据需要有Controller从Model获取后提供给View。 (3)Controller的作用 控制器主要负责功能处理部分,Controller 是属于一个协调者的角色,因为M-V-C三个部分并没有直接的关联。 #####3、工作流程图  用户向控制器发送请求,控制器进行功能处理后向业务模型做出数据库相关请求,业务模型将相应业务数据返回给控制器,控制器传给视图,最终完成相应并展示给用户。 注:大家要循序渐进不要想一口气吃个胖子,我的课程都是循序渐进的。作为一个负责任的技术分享者,课程全部录完我会给大家整理好对应导图。 #####4、使用MVC的优缺点分析 再次强调一个事物一定要根据自己的项目实际情况进行技术选型,适合的才是最好的,没有绝对。技术选型上我们要分析利弊,采用合适的解决方案。 (1)优点: (1 耦合性低:因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。 (2 重用性高:MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型。 (3 部署快,生命周期成本低:MVC使开发和维护用户接口的技术含量降低。后端工程师集中精力于业务逻辑,前端工程师集中精力于表现形式上。 (4 可维护性高:分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。 (2)缺点: (1 完全理解MVC的人不多:同学们的实践经验不足或没有经过系统性学习,完全理解并掌握MVC不是一个很容易的过程。 (2 调试困难:因为模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难,每个构件在使用之前都需要经过彻底的测试。 (3 不适合小型,中等规模的应用程序:在一个中小型的应用程序中,强制性的使用MVC进行开发,往往会花费大量时间,并且不能体现MVC的优势,同时会使开发变得繁琐。 (4 增加系统结构和实现的复杂性:对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。 (5 视图对模型数据的访问效率降低:每次调用都要通过控制器通道使得效率降低。 (6 视图与控制器连接过于紧密:本来相互分离,但确实是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。 #####5、ASP.NET MVC有哪些关键技术 (1)ActionResult : Action 的返回类型 (2)Filter :过滤器 (3)ModelBinder : Model绑定器 (4)Url Routing :Url路由规则 (5)视图引擎:ASP .NET MVC包含多种视图引擎,其中以WebForms(即aspx)以及WebPages(Razor)最为常用。我在下面会展开讲。 ####第二节自己创建MVC项目 1.新建空MVC项目  给项目取名  创建选择MVC并且把默认勾选的https取消  你会得到一个半成品的脚手架  1)RouteConfig.cs是用来配置路由规则的 ``` using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace one { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } } ``` 2)Controllers文件是用来存放控制器的,即MVC中的C 3)Models文件是用来存放数据或数据操作的,即MVC中的M 4)Views是用来给用户看的存放视图的,即MVC中的V,中间默认生成了一个配置文件web.config其中配置了razor引擎 ``` <?xml version="1.0"?> <configuration> <configSections> <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> </sectionGroup> </configSections> <system.web.webPages.razor> <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <pages pageBaseType="System.Web.Mvc.WebViewPage"> <namespaces> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Routing" /> <add namespace="one" /> </namespaces> </pages> </system.web.webPages.razor> <appSettings> <add key="webpages:Enabled" value="false" /> </appSettings> <system.webServer> <handlers> <remove name="BlockViewHandler"/> <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" /> </handlers> </system.webServer> <system.web> <compilation> <assemblies> <add assembly="System.Web.Mvc, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> </assemblies> </compilation> </system.web> </configuration> ``` 5)Global.asax用来配置全局 ``` using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; using System.Web.Security; using System.Web.SessionState; namespace one { public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); } } } ``` 6)packages.config和Web.config分别是包信息和配置信息。 2.编写一个测试页面 1)Controllers文件下创建一个HomeController控制器   2)Views文件夹下创建`Share`文件夹并添加名称为`_Layout.cshtml`的部分试图,并填充代码如下:  ``` <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>@ViewBag.Title -机遇屋</title> </head> <body> @RenderBody() @*留空,填充位置*@ </body> </html> ``` 3)创建Index视图  我们可以看到自动在`Views`- `Home`下创建了`Index.cshtml`视图  代码如下: ``` @{ ViewBag.Title = "Index"; Layout = "~/Views/Share/_Layout.cshtml"; } <h2>Index</h2> ``` 4)将项目one设置为启动项目,并启动  至此我们的MVC项目就创建成功了。 ####第三节MVC框架Filter MVC Filter是典型的AOP(面向切面编程)应用,了解Filter之前必须了解AOP,不然你一直停留在用的层次,这不是一个很好的学习态度。 #####主要功能 日志记录,性能统计,安全控制,事务处理,异常处理等等。 #####主要意图 将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。 #####AOP与OOP AOP、OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。 而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。 很多人在初次接触 AOP 的时候可能会说,AOP 能做到的,一个定义良好的 OOP 的接口也一样能够做到,我想这个观点是值得商榷的。AOP和定义良好的 OOP 的接口可以说都是用来解决并且实现需求中的横切问题的方法。但是对于 OOP 中的接口来说,它仍然需要我们在相应的模块中去调用该接口中相关的方法,这是 OOP 所无法避免的,并且一旦接口不得不进行修改的时候,所有事情会变得一团糟;AOP 则不会这样,你只需要修改相应的 Aspect,再重新编织(weave)即可。 当然,AOP 也绝对不会代替 OOP。核心的需求仍然会由 OOP 来加以实现,而 AOP 将会和 OOP 整合起来,以此之长,补彼之短。  #####ASP.NET的四种Filte 分类|接口|默认实现|说明 -|-|-|- Action|IActionFilter|ActionFilterAttribute|在动作方法之前及之后运行 Result|IResultFilter|ActionFilterAttribute|在动作结果被执行之前和之后运行 AuthorizationFilter|IAuthorizationFilter|AuthorizeAttribute|首先运行,在任何其它过滤器或动作方法之前 Exception|IExceptionFilter|HandleErrorAttribute|只在另一个过滤器、动作方法、动作结果弹出异常时运行 但是默认实现它们的过滤器只有三种,分别是ActionFilter(方法),Authorize(授权),HandleError(错误处理)。 1、Action过滤器 在ASP.NET MVC中创建MvcApp项目,创建文件夹Filter,然后新建类MyActionFilterAttribute(为了遵循默认的约定,名称以Attribute结尾),继承自ActionFilterAttribute类。ActionFilterAttribute类有如下4个方法。 ``` using System; namespace System.Web.Mvc { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] public abstract class ActionFilterAttribute : FilterAttribute, IActionFilter, IResultFilter { protected ActionFilterAttribute(); public virtual void OnActionExecuted(ActionExecutedContext filterContext); public virtual void OnActionExecuting(ActionExecutingContext filterContext); public virtual void OnResultExecuted(ResultExecutedContext filterContext); public virtual void OnResultExecuting(ResultExecutingContext filterContext); } } ``` 实现MyActionFilterAttribute类: ``` using System; using System.Web.Mvc; namespace MvcApp.Filter { public class MyActionFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { //1、获取请求的类名和方法名 string strController = filterContext.RouteData.Values["controller"].ToString(); string strAction = filterContext.RouteData.Values["action"].ToString(); //2、用另一种方式获取请求的类名和方法名 string strController2 = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName; string strAction2 = filterContext.ActionDescriptor.ActionName; filterContext.HttpContext.Response.Write("控制器:" + strController + "<br/>"); filterContext.HttpContext.Response.Write("控制器:" + strController2 + "<br/>"); filterContext.HttpContext.Response.Write("Action:" + strAction + "<br/>"); filterContext.HttpContext.Response.Write("Action:" + strAction2 + "<br/>"); filterContext.HttpContext.Response.Write("Action执行前:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss fff") + "<br/>"); base.OnActionExecuting(filterContext); } public override void OnActionExecuted(ActionExecutedContext filterContext) { filterContext.HttpContext.Response.Write("Action执行后:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss fff") + "<br/>"); base.OnActionExecuted(filterContext); } } } ``` 对于过滤器,我们可以把它们加在3个地方,一个是控制器上面(控制器下面的所有Action),一个是Action上面(指定标识的Action),另一个就是全局位置(所有控制器中的Action)。这里只演示在Action上面和Home控制器中: ``` [MyActionFilter] public ActionResult Index() { return View(); } ``` 2、Result过滤器 新建MyResultFilterAttribute类,继承ActionFilterAttribute: ``` using System; using System.Web.Mvc; namespace MvcApp.Filter { public class MyResultFilterAttribute : ActionFilterAttribute { /// <summary> /// 加载“视图”前执行 /// </summary> /// <param name="filterContext"></param> public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Write("加载视图前执行 OnResultExecuting" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss fff") + "<br/>"); base.OnResultExecuting(filterContext); } /// <summary> /// 加载“视图”后执行 /// </summary> /// <param name="filterContext"></param> public override void OnResultExecuted(ResultExecutedContext filterContext) { filterContext.HttpContext.Response.Write("加载视图后执行 OnResultExecuted" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss fff") + "<br/>"); base.OnResultExecuted(filterContext); } } } ``` 这里把MyResultFilter过滤器加在控制器上面,相当于给Home控制器中的所有的Action方法添加了MyResultFilter过滤器。 ``` using MvcApp.Filter; using System.Web.Mvc; namespace MvcApp.Controllers { [MyResultFilter] public class HomeController : Controller { [MyActionFilter] public ActionResult Index() { return View(); } } } ``` 3、AuthorizeAttribute过滤器 创建MyAuthorizeAttribute类,继承AuthorizeAttribute类: ``` using System.Web.Mvc; namespace MvcApp.Filter { /// <summary> /// 授权过滤器 /// </summary> public class MyAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { filterContext.HttpContext.Response.Write("OnAuthorization<br/>"); //注释掉父类方法,因为父类里的OnAuthorization方法会调用ASP.NET的授权验证机制 //base.OnAuthorization(filterContext); } } } ``` 在控制器Home中的Index上添加MyAuthorize过滤器: ``` [MyAuthorize] [MyActionFilter] public ActionResult Index() { return View(); } ``` 通常Authorize过滤器也是在全局过滤器上面的,主要用来做登录验证或者权限验证,在App_Start目录下的FilterConfig类的RegisterGlobalFilters方法中添加: ``` public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //filters.Add(new HandleErrorAttribute()); //添加全局授权过滤器 filters.Add(new MyAuthorizeAttribute()); } } ``` 在全局中注册过滤器,则所有控制器的所有行为(Action)都会执行这个过滤器。 4、Exception过滤器 创建MyHandleErrorAttribute类,继承HandleErrorAttribute类: ``` using System; using System.Web.Mvc; namespace MvcApp.Filter { /// <summary> /// 异常处理过滤器 /// </summary> public class MyHandleErrorAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { //1、获取异常对象 Exception ex = filterContext.Exception; //2、记录异常日志 //3、重定向友好页面 filterContext.Result = new RedirectResult("~/error.html"); //4、标记异常已经处理完毕 filterContext.ExceptionHandled = true; base.OnException(filterContext); } } } ``` 在Action上面添加MyHandleError过滤器: ``` [MyHandleError] public ActionResult GetErr() { int a = 0; int b = 1 / a; return View(); } ``` 创建异常错误友好提示页面error.html。 ``` <body> 自定义错误页面 </body> ``` 运行会自动跳转到error.html页面。 如果页面没有跳转,就需要去Web.config配置文件中的<system.web>节点下面添加如下配置节点,开启自定义错误: ``` <customErrors mode="On"></customErrors> ``` 通常这样的异常处理是放在全局过滤器上面的,只要任意Action方法报错就会执行MyHandleError过滤器中的代码。 修改App_Start目录下面的`FilterConfig`类: ``` public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //filters.Add(new HandleErrorAttribute()); //添加全局授权过滤器 filters.Add(new MyAuthorizeAttribute()); //添加全局异常处理过滤器 filters.Add(new MyHandleErrorAttribute()); } } Global.asax下的代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; namespace MvcApp { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } } } ``` **第三节讲完了,我要提醒大家如果想学习.net可以直接入手.net core了,我们决定至此`.net 基础`开发讲解就此结束,并决定免费开放出来,前期购买了的学员已经完成了全部退费,感谢各位的支持。**
上一篇
下一篇
版权所有:机遇屋在线 Copyright © 2021-2025 jiyuwu Co., Ltd.
鲁ICP备16042261号-1