ASP.NET MVC框架的结构特点及其工作原理.doc
A S P.N E T M V C框架的结构特点及其工作原理
2020年4月
MVC框架的结构特点及其工作原理本文关键词:工作原理,框架,结构,ASP,NET
MVC框架的结构特点及其工作原理本文简介:MVC是微软官方提供的以MVC模式为基础的Web应用程序(WebApplication)框架,它的出现极大促进了WEB模式的应用和发展。
但是不同的平台和不同的语言框架对MVC的定义各有不同,并没有一个明确的定义。
本文重点介绍了MVC模式与MVC框架的结构特点
MVC框架的结构特点及其工作原理本文内容:
MVC 是微软官方提供的以MVC模式为基础的Web应用程序(Web Application)框架,它的出现极大促进了WEB模式的应用和发展。
但是不同的平台和不同的语言框架对MVC的定义各有不同,并没有一个明确的定义。
本文重点介绍了MVC模式与 MVC 框架的结构特点及其工作原理。
1 MVC模式概述
1。
ASP.NET4.5网站开发与应用实践教程第十五章ASP.NETMVC4框架
312
15.1.2
MVC 优缺点
在使用 ASP 或者 PHP 开发 Web 应用时,初始的开发模板就是混合层的数据编程。 例如,直接向数据库发送请求并用 HTML 显示,开发速度往往比较快。但由于数据页面
MVC 4 框架 的分离不是很直接,因而很难体现出业务模型的样子或者模型的重用性,很难满足用户 的变化性需求。 MVC 要求对应用分层,虽然要花费额外的工作,但产品的结构清晰,产品的应用通 过模型可以得到更好的体现。 (1)首先,最重要的是应该有多个视图对应一个模型的能力。在目前用户需求的快 速变化下,可能有多种方式访问应用的要求。 例如,订单模型可能有本系统的订单,也有网上订单,或者其他系统的订单,但对 于订单的处理都是一样,也就是说订单的处理是一致的。按 MVC 设计模式,一个订单 模型以及多个视图即可解决问题。这样减少了代码的复制,即减少了代码的维护量,一 旦模型发生改变,也易于维护。 (2)其次,由于模型返回的数据不带任何显示格式,因而这些模型也可直接应用于 接口的使用。 (3)再次,由于一个应用被分离为三层,因此有时改变其中的一层就能满足应用的 改变。一个应用的业务流程或者业务规则的改变只需改动 MVC 的模型层。 (4)控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起完成不 同的请求,因此,控制层可以说是包含用户请求权限的概念。 (5)最后,它还有利于软件工程化管理。由于不同的层各司其职,每一层不同的应 用具有某些相同的特征,有利于通过工程化、工具化产生管理程序代码。 凡事都不是绝对的,MVC 也是如此。MVC 也不是最先进、最优秀或者最好的选择, 其缺点主要体现在以下几个方面: (1)增加了系统结构和实现的复杂性。 对于简单的界面,严格遵循 MVC,使模型、视图与控制器分离,会增加结构的复杂 性,并可能产生过多的更新操作,降低运行效率。 (2)视图与控制器间过于紧密的连接。 视图与控制器是相互分离的, 但是又紧密联系的部分, 如果视图没有控制器的存在, 那它的应用是很有限的。反之亦然,这样就妨碍了它们的独立重用。 (3)视图对于模型数据的低效率访问。 依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未 变化数据的不必要的频繁访问,也将损害操作性能。 目前, 一般高级的界面工具或者构造器不支持 MVC 架构。 改造这些工具以适应 MVC 需要和建立分离部分的代价是很高的,从而造成使用 MVC 的困难。
mvc框架工作原理
mvc框架工作原理MVC框架工作原理。
MVC(Model-View-Controller)是一种软件设计模式,它将应用程序分为三个核心部分,模型(Model)、视图(View)和控制器(Controller)。
这种模式的设计使得应用程序的逻辑、数据和界面分离,从而提高了代码的可维护性和灵活性。
在本文中,我们将深入探讨MVC框架的工作原理,以及它是如何实现数据和用户界面之间的交互的。
首先,让我们来了解一下MVC框架的三个核心部分:1. 模型(Model),模型负责管理应用程序的数据和业务逻辑。
它与数据库交互,处理数据的存储和检索,并且包含了应用程序的核心功能。
模型通常不直接与用户界面交互,而是通过控制器来实现数据的传递和处理。
2. 视图(View),视图是用户界面的表示,它负责将模型中的数据以合适的方式呈现给用户。
视图通常包括了HTML、CSS和JavaScript等前端技术,用于构建用户友好的界面,并且能够与用户进行交互。
3. 控制器(Controller),控制器充当模型和视图之间的中介,它接收用户的输入并调用模型来处理数据,然后将处理结果传递给视图进行展示。
控制器负责应用程序的流程控制,它根据用户的请求选择合适的模型和视图进行处理。
MVC框架的工作原理可以简单概括为以下几个步骤:1. 用户发送请求,用户通过浏览器或其他客户端向服务器发送请求,请求特定的资源或操作。
2. 控制器处理请求,服务器接收到用户的请求后,控制器根据请求的类型选择合适的模型进行处理,并且选择合适的视图进行展示。
3. 模型处理数据,模型接收到控制器传递的请求后,进行数据的处理和操作,然后将处理结果返回给控制器。
4. 视图展示数据,控制器接收到模型返回的处理结果后,选择合适的视图进行展示,并将处理结果呈现给用户。
5. 用户交互操作,用户在视图中进行交互操作,例如填写表单、点击按钮等,触发新的请求。
6. 重复上述步骤,根据用户的交互操作,控制器再次选择合适的模型进行处理,并且选择合适的视图进行展示,从而实现数据和用户界面之间的交互。
ASP.NET MVC架构与Web开发研究
MVC架构与Web开发研究随着互联网的普及,Web开发已经成为了一个非常重要的领域。
随之而来的,各种Web 开发框架层出不穷,其中 MVC架构在市场上占据一席之地。
本文将对 MVC 架构与Web开发进行研究,探讨其特点、优势以及应用场景。
一、 MVC架构概述 MVC(Model View Controller)是由微软公司推出的一种Web应用程序架构。
与传统的Web Forms相比, MVC更加注重MVC模式的分离,使得在项目开发过程中更加清晰,易于维护和扩展。
MVC采用开放源代码方式发布,使得开发者可以更加灵活地进行定制和扩展。
在 MVC架构中,模型(Model)负责数据的处理和存储,视图(View)负责用户界面的展示,控制器(Controller)负责接收用户请求并决定如何处理。
这种分离的架构使得各个组件之间的耦合度大大降低,也更加符合面向对象设计的原则。
1. 灵活性: MVC允许开发者根据项目需求来选择合适的组件,实现定制化开发。
而且,由于其开放源代码的特性,开发者还可以通过扩展来满足自己的需求。
2. 易于维护:由于MVC架构的分离性,每个组件的职责明确,因此在项目维护过程中更加清晰明了。
3. 支持测试驱动开发: MVC架构支持测试驱动开发(TDD),开发者可以通过单元测试和集成测试来验证代码的正确性和稳定性。
4. 丰富的控件库: MVC拥有丰富的控件库,开发者可以方便地实现页面布局和功能扩展,提高开发效率。
5. 支持异步编程: MVC提供了异步编程的支持,能够更好地应对并发访问和大流量的情况。
1. 性能优越:由于MVC架构的分离性,使得程序的性能得到了提升。
MVC架构可以更好地利用服务器资源,提高页面响应速度。
2. 更好的SEO支持: MVC框架对搜索引擎友好,使得网站更容易被搜索引擎收录,有助于网站的推广和曝光。
3. 更加灵活的URL: MVC允许开发者根据需要更改URL结构,使得用户更加容易记忆和理解,提高用户体验。
mvc框架的原理
mvc框架的原理MVC框架的原理MVC(Model-View-Controller)是一种软件设计模式,被广泛应用于Web开发中。
它的核心原理是将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。
这种分离的架构使得代码的重用、维护和扩展更加容易。
1. 模型(Model)模型是MVC框架中的数据层,负责处理应用程序的数据逻辑。
它包含了数据的定义、存储和访问方法。
模型能够独立于视图和控制器存在,在不同的视图和控制器之间共享数据。
模型的设计要求高内聚、低耦合,以便于模块的独立开发和测试。
2. 视图(View)视图是MVC框架中的用户界面层,负责展示模型中的数据给用户。
它通常是由HTML、CSS和JavaScript组成的,用于呈现数据和接收用户的输入。
视图应该只负责数据的展示,而不涉及数据的处理逻辑。
通过与控制器的交互,视图能够获取模型中的数据,并将其呈现给用户。
3. 控制器(Controller)控制器是MVC框架中的逻辑层,负责接收用户的输入并处理相应的业务逻辑。
它从视图中接收用户的请求,然后根据请求的类型调用相应的模型方法进行数据处理。
处理完数据后,控制器将结果传递给视图进行显示。
控制器起到了模型和视图之间的桥梁作用,协调两者之间的交互。
MVC框架的工作流程如下:1. 用户通过视图与应用程序进行交互,发送请求。
2. 视图将请求传递给控制器。
3. 控制器接收到请求后,根据请求的类型调用相应的模型方法进行数据处理。
4. 模型处理完数据后,将结果返回给控制器。
5. 控制器将结果传递给视图。
6. 视图根据控制器传递的结果进行数据展示给用户。
MVC框架的优点有:1. 分离关注点:MVC框架将应用程序的不同功能分离到不同的模块中,使得代码更加易于理解和维护。
开发人员可以专注于特定的领域,提高开发效率。
2. 可扩展性:由于MVC框架的松耦合设计,可以方便地对模型、视图和控制器进行扩展和替换,以满足不同的需求。
ASP.NETMVC教程一:ASP.NETMVC简介
MVC教程⼀:MVC简介⼀、MVC模式简介MVC模式是⼀种流⾏的Web应⽤架构技术,它被命名为模型-视图-控制器(Model-View-Controller)。
在分离应⽤程序内部的关注点⽅⾯,MVC是⼀种强⼤⽽简洁的⽅式,尤其适合应⽤在Web应⽤程序中。
MVC将应⽤程序的⽤户界⾯分为三个主要部分:1. 模型:⼀组类,描述了要处理的数据以及修改和操作数据的业务规则。
2. 视图:定义应⽤程序⽤户界⾯的显⽰⽅式。
3. 控制器:⼀组类,⽤于处理来⾃⽤户、整个应⽤程序流以及特定应⽤程序逻辑的通信。
1、MVC在Web框架中的应⽤MVC模式经常应⽤于Web程序设计中。
在 MVC中,MVC三个主要部分的定义⼤致如下:模型:模型是描述程序设计⼈员感兴趣问题域的⼀些类,这些类通常封装存储在数据库中的数据,以及操作这些数据和执⾏特定域业务逻辑的代码。
在 MVC中,模型就像使⽤了某种⼯具的数据访问层(Daa Access Layer),这种⼯具包括实体框架(Entity Framework)或者与包含特定域逻辑的⾃定义代码组合在⼀起的其他实体框架。
视图:⼀个动态⽣成HTML页⾯的模板。
控制器:⼀个协调视图和模型直接关系的特殊类。
它响应⽤户输⼊,与模型进⾏对话,并决定呈现哪个视图(如果有的话)。
在 MVC中,这个类⽂件通常以后缀名Controller表⽰。
2、执⾏顺序在 MVC中的执⾏顺序可以⽤下图进⾏表⽰,如图所⽰:其执⾏顺序可以描述如下:⽤户在浏览器地址栏⾥⾯输⼊要访问的⽹址,然后发起请求,控制器接收⽹页发送的请求,如果需要请求数据,则先从Model⾥⾯取出数据交给控制器,然后把数据交给视图,视图负责展现数据。
如果不需要请求数据,则直接返回视图呈现给⽤户。
⼆、中的MVC1、 MVC和1. MVC是技术的⼦集。
2. MVC在核⼼基础之上构建:1. 依赖于HttpHandler,如请求是如何进⼊控制器的。
2. 依赖于Session、Cookie、Cache、Application等状态保持机制。
Asp.NetMVC三:ASP.NETMVC基本原理及项目创建
MVC三:MVC基本原理及项⽬创建MVC模拟(摘⾃ MVC5框架揭秘)中,通过HttpModule的形式定义拦截器,也就是路由表的调⽤。
路由表解析出相应的Controller类型和Action⽅法的名称及必要参数。
然后依据路由数据和请求上下⽂,选择特定的HttpHandler,采⽤反射的机制激活⽬标Controller,执⾏相应的⽅法。
实现IHttpModule创建⾃定义的拦截器public class UrlRoutingModule : IHttpModule{public void Dispose(){ }public void Init(HttpApplication context){context.PostResolveRequestCache += OnPostResolveRequestCache;}//调⽤路由表,依据路由数据切换Handlerprotected virtual void OnPostResolveRequestCache(object sender, EventArgs e){HttpContextWrapper httpContext = new HttpContextWrapper(HttpContext.Current);RouteData routeData = RouteTable.Routes.GetRouteData(httpContext);if (null == routeData){return;}RequestContext requestContext = new RequestContext{RouteData = routeData,HttpContext = httpContext};IHttpHandler handler = routeData.RouteHandler.GetHttpHandler(requestContext);httpContext.RemapHandler(handler);}}实现IHttpHandler创建⾃定义的处理程序public class MvcHandler : IHttpHandler{public bool IsReusable{get { return false; }}public RequestContext RequestContext { get; private set; }public MvcHandler(RequestContext requestContext){this.RequestContext = requestContext;}public void ProcessRequest(HttpContext context){string controllerName = this.RequestContext.RouteData.Controller;IControllerFactory controllerFactory = ControllerBuilder.Current.GetControllerFactory();IController controller = controllerFactory.CreateController(this.RequestContext, controllerName);controller.Execute(this.RequestContext);}}路由表解析URLpublic class RouteTable{public static RouteDictionary Routes { get; private set; }static RouteTable(){Routes = new RouteDictionary();}}public class RouteDictionary : Dictionary<string, RouteBase>{//路由对象集合,⾃带遍历匹配路由的⽅法public RouteData GetRouteData(HttpContextBase httpContext){foreach (var route in this.Values){RouteData routeData = route.GetRouteData(httpContext);if (null != routeData){return routeData;}}return null;}}继承RouteBase创建⾃定义的Route类型//路由public class Route : RouteBase{//匹配相应的IHttpHandlerpublic IRouteHandler RouteHandler { get; set; }//路由模版public string Url { get; set; }//限定的命名空间集合public IDictionary<string, object> DataTokens { get; set; }public Route(){this.DataTokens = new Dictionary<string, object>();this.RouteHandler = new MvcRouteHandler();}//获取路由数据,不匹配则返回null.public override RouteData GetRouteData(HttpContextBase httpContext){IDictionary<string, object> variables;if (this.Match(httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2), out variables)){//匹配成功RouteData routeData = new RouteData();//Controller和Action名称foreach (var item in variables){routeData.Values.Add(item.Key, item.Value);}//模版中限定的命名空间集合foreach (var item in DataTokens){routeData.DataTokens.Add(item.Key, item.Value);}//IHttpHandler路由routeData.RouteHandler = this.RouteHandler;return routeData;}return null;}//判别当前路由对象(this)是否匹配,匹配则找到对应的Controller和Action名称 protected bool Match(string requestUrl, out IDictionary<string, object> variables) {variables = new Dictionary<string, object>();string[] strArray1 = requestUrl.Split('/');string[] strArray2 = this.Url.Split('/');if (strArray1.Length != strArray2.Length){return false;}for (int i = 0; i < strArray2.Length; i++){if (strArray2[i].StartsWith("{") && strArray2[i].EndsWith("}")){variables.Add(strArray2[i].Trim("{}".ToCharArray()), strArray1[i]);}}return true;}}路由数据//由路由解析得到的路由数据public class RouteData{public IDictionary<string, object> Values { get; private set; }public IDictionary<string, object> DataTokens { get; private set; }public IRouteHandler RouteHandler { get; set; }public RouteBase Route { get; set; }public RouteData(){this.Values = new Dictionary<string, object>();this.DataTokens = new Dictionary<string, object>();this.DataTokens.Add("namespaces", new List<string>());}public string Controller{get{object controllerName = string.Empty;this.Values.TryGetValue("controller", out controllerName);return controllerName.ToString();}}public string ActionName{get{object actionName = string.Empty;this.Values.TryGetValue("action", out actionName);return actionName.ToString();}}}初始化(将⾃定义的路由对象加⼊路由表)public class Global : System.Web.HttpApplication{protected void Application_Start(object sender, EventArgs e){RouteTable.Routes.Add("default", new Route { Url = "{controller}/{action}" });}}实现IRouteHandler⾃定义HttpHandler提供机制public class MvcRouteHandler : IRouteHandler{public IHttpHandler GetHttpHandler(RequestContext requestContext){return new MvcHandler(requestContext);}}Controller实例的获取public class ControllerBuilder{private Func<IControllerFactory> factoryThunk;public static ControllerBuilder Current { get; private set; }static ControllerBuilder(){Current = new ControllerBuilder();}public IControllerFactory GetControllerFactory(){return factoryThunk();}public void SetControllerFactory(IControllerFactory controllerFactory){factoryThunk = () => controllerFactory;}}public class DefaultControllerFactory : IControllerFactory{private static List<Type> controllerTypes = new List<Type>();static DefaultControllerFactory(){//查找包内所有IControllerforeach (Assembly assembly in BuildManager.GetReferencedAssemblies()){foreach (Type type in assembly.GetTypes().Where(type => typeof(IController).IsAssignableFrom(type))) {controllerTypes.Add(type);}}}public IController CreateController(RequestContext requestContext, string controllerName){string typeName = controllerName + "Controller";Type controllerType = controllerTypes.FirstOrDefault(c => pare(typeName, , true) == 0);if (null == controllerType){return null;}return (IController)Activator.CreateInstance(controllerType);}}初始化(添加Controller⼯⼚实例)public class Global : System.Web.HttpApplication{protected void Application_Start(object sender, EventArgs e){ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory());}}Action⽅法的执⾏public abstract class ControllerBase : IController{protected IActionInvoker ActionInvoker { get; set; }public ControllerBase(){this.ActionInvoker = new ControllerActionInvoker();}public void Execute(RequestContext requestContext){ControllerContext context = new ControllerContext{RequestContext = requestContext,Controller = this};string actionName = requestContext.RouteData.ActionName;this.ActionInvoker.InvokeAction(context, actionName);}}public class ControllerActionInvoker : IActionInvoker{public IModelBinder ModelBinder { get; private set; }public ControllerActionInvoker(){this.ModelBinder = new DefaultModelBinder();}public void InvokeAction(ControllerContext controllerContext, string actionName){MethodInfo methodInfo = controllerContext.Controller.GetType().GetMethods().First(m => pare(actionName, , true) == 0); List<object> parameters = new List<object>();foreach (ParameterInfo parameter in methodInfo.GetParameters()){parameters.Add(this.ModelBinder.BindModel(controllerContext, , parameter.ParameterType));}ActionExecutor executor = new ActionExecutor(methodInfo);ActionResult actionResult = (ActionResult)executor.Execute(controllerContext.Controller, parameters.ToArray());actionResult.ExecuteResult(controllerContext);}}internal class ActionExecutor{private static Dictionary<MethodInfo, Func<object, object[], object>> executors = new Dictionary<MethodInfo, Func<object, object[], object>>(); private static object syncHelper = new object();public MethodInfo MethodInfo { get; private set; }public ActionExecutor(MethodInfo methodInfo){this.MethodInfo = methodInfo;}public object Execute(object target, object[] arguments){Func<object, object[], object> executor;if (!executors.TryGetValue(this.MethodInfo, out executor)){lock (syncHelper){if (!executors.TryGetValue(this.MethodInfo, out executor)){executor = CreateExecutor(this.MethodInfo);executors[this.MethodInfo] = executor;}}}return executor(target, arguments);}private static Func<object, object[], object> CreateExecutor(MethodInfo methodInfo){ParameterExpression target = Expression.Parameter(typeof(object), "target");ParameterExpression arguments = Expression.Parameter(typeof(object[]), "arguments");List<Expression> parameters = new List<Expression>();ParameterInfo[] paramInfos = methodInfo.GetParameters();for (int i = 0; i < paramInfos.Length; i++){ParameterInfo paramInfo = paramInfos[i];BinaryExpression getElementByIndex = Expression.ArrayIndex(arguments, Expression.Constant(i));UnaryExpression convertToParameterType = Expression.Convert(getElementByIndex, paramInfo.ParameterType);parameters.Add(convertToParameterType);}UnaryExpression instanceCast = Expression.Convert(target, methodInfo.ReflectedType);MethodCallExpression methodCall = Expression.Call(instanceCast, methodInfo, parameters);UnaryExpression convertToObjectType = Expression.Convert(methodCall, typeof(object));return mbda<Func<object, object[], object>>(convertToObjectType, target, arguments).Compile();}}public class RawContentResult : ActionResult{private Action<TextWriter> Callback { get; set; }public RawContentResult(Action<TextWriter> action){this.Callback = action;}public override void ExecuteResult(ControllerContext context){this.Callback(context.RequestContext.HttpContext.Response.Output);}}解析Action的参数public class DefaultModelBinder : IModelBinder{public object BindModel(ControllerContext controllerContext, string modelName, Type modelType){if (modelType.IsValueType || typeof(string) == modelType){object instance;if (GetValueTypeInstance(controllerContext, modelName, modelType, out instance)){return instance;};return Activator.CreateInstance(modelType);}object modelInstance = Activator.CreateInstance(modelType);foreach (PropertyInfo property in modelType.GetProperties()){if (!property.CanWrite || (!property.PropertyType.IsValueType && property.PropertyType != typeof(string))){continue;}object propertyValue;if (GetValueTypeInstance(controllerContext, ,property.PropertyType, out propertyValue)){property.SetValue(modelInstance, propertyValue, null);}}return modelInstance;}private bool GetValueTypeInstance(ControllerContext controllerContext, string modelName, Type modelType, out object value) {Dictionary<string, object> dataSource = new Dictionary<string, object>();//数据来源⼀:HttpContext.Current.Request.Formforeach (string key in HttpContext.Current.Request.Form){if (dataSource.ContainsKey(key.ToLower())){continue;}dataSource.Add(key.ToLower(), HttpContext.Current.Request.Form[key]);}//数据来源⼆:HttpContext.Current.Request.QueryStringforeach (string key in HttpContext.Current.Request.QueryString){if (dataSource.ContainsKey(key.ToLower())){continue;}dataSource.Add(key.ToLower(), HttpContext.Current.Request.QueryString[key]);}//数据来源三:ControllerContext.RequestContext.RouteData.Valuesforeach (var item in controllerContext.RequestContext.RouteData.Values){if (dataSource.ContainsKey(item.Key.ToLower())){continue;}dataSource.Add(item.Key.ToLower(), controllerContext.RequestContext.RouteData.Values[item.Key]);}//数据来源四:ControllerContext.RequestContext.RouteData.DataTokensforeach (var item in controllerContext.RequestContext.RouteData.DataTokens){if (dataSource.ContainsKey(item.Key.ToLower())){continue;}dataSource.Add(item.Key.ToLower(), controllerContext.RequestContext.RouteData.DataTokens[item.Key]);}if (dataSource.TryGetValue(modelName.ToLower(), out value)){value = Convert.ChangeType(value, modelType);return true;}return false;}}ActionResultpublic class HomeController : ControllerBase{public ActionResult Index(SimpleModel model){Action<TextWriter> callback = writer =>{writer.Write(string.Format("Controller: {0}<br/>Action: {1}<br/><br/>", model.Controller, model.Action));writer.Write(string.Format("Foo: {0}<br/>Bar: {1}<br/>Baz: {2}", model.Foo, model.Bar, model.Baz));};return new RawContentResult(callback);}}MVC项⽬搭建MVC5中只有⼀种 Web Application项⽬类型。
《ASP NET程序设计及实践》课件11_第11章 学习ASP.NET MVC
MVC访问流程
应用程序的执行过程首先会找到路由规则类,根据路由规则类 中的路由规则进lass 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 } );
目标
➢ 了解 MVC组成 ➢ 了解 MVC访问流程 ➢ 了解路由规则 ➢ 掌握控制器操作 ➢ 掌握视图操作
-1-
MVC组成
MVC是微软官方提供的以MVC模式为基础的 Web 应用程序(Web Application)框架,MVC主要分为三层架构:
-5-
试图View
@{ ViewBag.Title = "Index";
} <h2>Hello world !</h2>
-6-
小结
➢ MVC是微软官方提供的以MVC模式为基础的 Web应用 程序(Web Application)框架。
➢ MVC(Model、View、Controller)将一个Web应用分解为:Model、 View和Controller
➢ RouteConfig.cs类是 MVC应用程序的路由规则类,是应 用程序执行的规则
七天学会ASP.NETMVC(1)--深入理解MVC
七天学会MVC(1)--深入理解MVC许多 开发人员开始接触 MVC,都认为 MVC 与 完全没有关系,是一个全新的 Web 开发。
事实上 是创建 WEB 应用的框架,而 MVC 是一种能够用更好的方法来组织并管理代码的体系,所以可以称之为 MVC。
因此,我们可以将原来的 称为 Webforms,新的 MVC 称为 MVC。
Webforms 在过去的十几年里,已经服务并成功实现Web 应用的开发。
那么,我们先了解一下为什么能够如此流行,并成功应用?微软编程语言从 VB 开始就能够成为流行并广泛应用,都源于其提供的强大的 Visual studio 能够进行可视化的编程,实现快速开发。
使用 VS 时,开发人员能够通过拖拽 UI 元素,并在后台自动生成这些界面的代码,称为后台代码。
在后台代码中,开发人员可以添加操作这些UI元素的逻辑代码。
因此微软的可视化RAD 架构体系有两方面组成,一方面是UI,一方面是后台代码。
WebForms 存在的问题响应时间如图所示,每一次 WebForms 请求都有转换逻辑,运行并转换服务器控件为HTML 输出。
如果页面使用表格,树形控件等复杂控件,转换就会变得很糟糕,HTML 输出也是非常复杂的。
由于这些不必要的转换从而增加了响应时间。
上图是 MVC 和 Webforms 的响应时间对比,我们会发现 Webforms 的响应时间是 MVC 的两倍左右。
带宽消耗 开发人员都非常熟悉 Viewstates,因为它能够自动保存post 返回的状态,减少开发时间。
但是这种开发时间的减少会带来巨大的消耗,Viewstate增加了页面的大小。
从上图中,我们可以看到与 MVC 对比,Viewstate 增加了两倍的页面存储。
MVC是怎么弥补这些问题的? MVC 由Model,View,Controller 三部分组成。
Controller 中包含后台代码逻辑,View 是ASPX,如纯 HTML 代码,Model 是中间层。
ASP.NET-MVC整体运行原理,走源码
MVC那些不为人知的一些事情有好些理解是直接写在源码里的,然后通过截图,放到这个Word里面,所以图很重要,有图有证据嘛。
有些不清晰的,就放大来看啦(Ctrl+滚轮上)哈哈···MVC运行的整体机制整体路线:浏览器发送请求→IIS捕获到请求,根据请求里面的信息找到对应的程序集→加载程序集,创建运行环境→包装请求信息(wr)→调用HttpRuntime的PR方法创建application(读取global文件,调用Application_Start方法) →初始化(读取配置文件(用户+系统的),调用InitModlues()方法),第七个事件里注册了UrlRoutingModules方法→创建MvcHandler,它包含了请求上下文信息,路由信息,并将其添加到上下文HttpContext →调用MvcHandler的PR方法,创建控制器,调用action(用户在Controller下面写的方法),将用户数据保存到父类里面。
→执行action返回ViewResult(包含了用户执行后的数据)→拿取视图引擎,调用Render()方法,生成Html代码,创建视图。
→能力有限,没求甚解。
愿互相学习,互相指正,共同进步。
【你必须非常努力,才能看起来毫不费力!】和的区别从UrlRoutingModules这个方法说起。
.NET 程序运行的时候,会先执行初始化,也就是调用Global文件里的Application_Start方法。
通过反射创建这个文件里的类(在里面就是Global类,在MVC下是MVCApplication 类,它们继承自HttpApplication类。
) 如果Global文件不存在,就直接创建他们的父类:HttpApplication。
接着在确保调用了Application_Start方法后,创建ApplicationInstance实例(对象池),然后进行初始化。
浅析Asp.net MVC框架
中国人 2 o l 4 年 3 月 ( 上 半 月 ) 第 5 期
浅 析 As p. n e t MVC 框 架
科学信息技术应用
杨 彦 刚 孟 磊 ( 指导老师 ) (辽 宁省 沈阳市沈阳师范大学 辽宁 沈阳 1 1 0 0 3 4 )
摘要 : 随着信息科 技的进 步 , 越来越 多的软件开发模 式展现 在我们 眼前 , 对于 一名优秀 的软件 工程 师, 选择 一个适 合项 目的框 架越发 的重 要。本文 主要介绍 A s p . n e t MV C开发模式。
一
MV C是许多开 发 人员 熟悉 的标 准设 计模 式 。一 些 类 型 的
、
1 . 模型 : 模型对 象是 实 现应用 程序 数据 域逻 辑 的应用 程序 索 的 U R L . U R L可 以不包含任何文件扩展 名 , 并且 可 以重 写 U R L 部件。通常 , 模型对象会检 索模型状 态并 将其存 储在数 据库 中。 使其对搜索引擎更加友好 。
关键词 : We b 、 模 式、 A s p . n e t 、 MV C
【 中图分类号 】 T P 3 1 1
【 文献标识码 】 A
【 文章编 号】 1 0 0 5 — 3 5 7 3 ( 2 0 1 4 ) 0 3— 0 1 3 4— 0 1
所 谓 的 MV C, 即 Mo d e l 、 V i e w、 C o n t r o l l e r .A s p . n e t MV C 是 微 端控制器模式 。这使您可 以设 计一个支 持丰 富路 由基础 结构 的 软官方提供的 MV C模式 编 写 A s p . n e t We b应用 程 序 的一个 框 应用程 序 。有 关 更 多信 息 , 请参见 F r o n t C o n t r o l l e r ( 前 端控 制 架, 它由 C a s t l e的 M o n o R a i l 而来 。 目前 已经 历 经 数 个 版 本 。MV C 器) 。 ( Mo d e l V i e w C o n t r o l l e r ) 把一个 w e b应用分成 了三个部 分 : Mo d e l 、 4 . 它为测试驱动 的开发 ( T D D)提供 了更好 的支持 。 V i e w和 C o n t r o l l e r .A S P .N E T MV C框 架 提供 了一个 可 以代 替 5 . 它非常适合大型开 发人员 团队支持 的 We b应 用程 序 , 以 a s p . n e t w e b窗体 的基于 m v c的应 用。A S P .N E T MV C框 架提供 及 需 要 对 应 用 程 序 行 为 进 行 严 格 控 制 的 W e b设 计 人 员 。
