zoukankan      html  css  js  c++  java
  • ASP.NET请求过程-视图如何返回客户端

    本文主要讲控制器返回ActionResult后怎么变成html到客户端的。

    控制器返回的各种类型

    返回所有类型的基类ActionResult

    //
    // 摘要:
    //     表示操作方法的结果。
    public abstract class ActionResult
    {
        //
        // 摘要:
        //     初始化 System.Web.Mvc.ActionResult 类的新实例。
        protected ActionResult();
    
        //
        // 摘要:
        //     通过从 System.Web.Mvc.ActionResult 类继承的自定义类型,启用对操作方法结果的处理。
        //
        // 参数:
        //   context:
        //     用于执行结果的上下文。上下文信息包括控制器、HTTP 内容、请求上下文和路由数据。
        public abstract void ExecuteResult(ControllerContext context);
    }
    ActionResult定义

    这是一个抽象类,主要是为了继承用。

    构造函数protected ActionResult();  限定了权限

    public abstract void ExecuteResult(ControllerContext context); 如何处理返回结果

    返回值ViewResult对应控制器方法View(...)

    ViewResult定义:表示一个类,该类用于使用由 System.Web.Mvc.IViewEngine 对象返回的 System.Web.Mvc.IView 实例来呈现视图。          

    就是说使用视图引擎(razor视图引擎  默认的,也可以自己定义)创建一个IView的对象,然后 用这个对象去渲染我们的视图(.cshtml),也就是替换视图中的后台代码。

    继承方式:

    public class ViewResult : ViewResultBase

    public abstract class ViewResultBase : ActionResult

     代码执行过程:

    ExcuteResult这个方法是在ViewResultBase 中重写的。

    mvc中也可以使用webform的视图引擎定义规则如下     其实都是定义好的,在代码里面写好的(路由用 controller action 名词,先匹配到的就返回,视图文件位置等等),所以说约定大于配置。

    razor的视图引擎定义规则

    RunViewStartPages作用

    ViewEngineResult详解

    返回值PartialViewResult对应控制其方法PartialView()

    定义:表示一个用于将分部视图发送到响应的基类。

    继承:

    public class PartialViewResult : ViewResultBase

    public abstract class ViewResultBase : ActionResult

    其实他和ViewResult差不多,唯一的区别的就是在PartialViewResult类中的protected override ViewEngineResult FindView(ControllerContext context)方法不同

     

     这个缺少了布局页的指定。感叹一下,设计强大呀。

     

    返回值JsonResult对应控制其方法JSON()

     定义:表示一个类,该类用于将 JSON 格式的内容发送到响应。

    继承:

    public class JsonResult : ActionResult

    这个比较简单只有一层继承。

    代码比较简单

     FileContentResult

    返回值FileStreamResult对应控制其方法File(。。。)

     file()根据参数不同,返回的result类型也不同

    以FileStreamResult为例

    protected internal FileStreamResult File(Stream fileStream, string contentType);

    定义:使用 System.IO.Stream 实例将二进制内容发送到响应。

    继承:

    public class FileStreamResult : FileResult

     public abstract class FileResult : ActionResult

    代码调用:

    以FileContentResult为例

    protected internal FileContentResultFile(byte[] fileContents, string contentType);

    定义:将二进制文件的内容发送到响应。

    继承:

    public class FileContentResult : FileResult

    public abstract class FileResult : ActionResult

    代码调用:

    其实文件类的都一样,都是要写成二进制,然后放入输出流

    其他的还有HttpNotFoundResult,JavaScriptResult,RedirectResult,RedirectToRouteResult,EmptyResult等各种Result

     这里都不在一一解释了。其实都是把数据写入输出流

    其中EmptyResult,什么也没有干。

    如果返回字符串,就不会调用ExecuteResult,直接把信息写入到HttpContext中,Response.ContentType 为"application/text"

    其实也可以返回Void,只用把数据写入输出流(Response.Write或者.OutputStream.Write),在设置内容格式Response.ContentType。

    action方法

     

    或者自己定义Result

    反射调用Action后,自动执行返回Result的ExecuteResult

    上节内容(ASP.NET请求过程-从源码角度研究MVC路由、Handler、控制器)讲到在MvcHandler中通过反射最后会调用action。这个是调用action的具体方法。在方法中还用调用  返回结果ActionResult的ExecuteResult方法。

    1,MvcHandler中调用InvokeAction

    2、 InvokeAction具体执行过程,最后执行了ActionResult.ExecuteResult

    图片有点大,可以把浏览器网页方法一点  (Ctrl   +    页面放大)(Ctrl   -    页面缩小)(Ctrl   0    页面还原)

    ASP.NET五大对象

    Request

    请求相关的信息,

    QueryString:请求链接后买拼接的参数

    Form:表单中的参数。

    File:上传的文件

    Response

    返回相关的信息

    Server

    他是一个工具型的类,里面一个帮助方法

    字符编码等

    Application

    不要认为他是HttpApplication,他只存在一个,是一个全局变量,注意加锁,所有的用户都是操作他。他的类型为HttpApplicationStateBase

    在控制器中获取的方法:HttpContext.Application

     (上面的四个对象 没有什么好写的    推荐文章http://blog.csdn.net/aojiancc2/article/details/19075103)

    Cookie Session

    首先HTTP协议是一个无状态的。就是第一次请求和第二次请求是没有联系的。

    web1.0的时候,网页只是可以展示一些东西,用户也只能被动的接受东西。

    他们是为了客户端和服务器可持续交互(简单的说就是用户登录了,让服务器和客户端持续知道他在登录)

    Cookie存在客户端浏览器配置的一个文件夹下面的一个文本中。服务器设置了Cookie(增,删,该),浏览器的接受 就会有一个设置Cookie。

    Session存在服务器中。服务器保存一个Session,浏览器会保存一个对应的Cookie记录对应的SessionID。一次回话只有一个SessionID。(这样就把每一个用户存的session区分开)

    浏览器的每次请求都会自动带上cookie的。

    cookie和session的沟通就是通过sessionid这个cookie来得。

     ASP.NET程序中  当一个浏览器第一次打一个页面,Session这个module(SessionStateModule)会检查请求的内容里面有没有cookie,没有的话就生成一个sessionid(不过现在session是空的),并且执行session_start,然后返回的时候就把sessionid放进cookie中给浏览器。)。如果访问的过程中,强行清空cookie,那么就会在生成一个sessionid。

    五大对象以及Httpcontext 在asp.net mvc中都进行了一次包装

  • 相关阅读:
    js 函数声明和函数表达式的区别
    使用dom4j工具包对xml文件解析
    xml的schema约束
    xml的DTD约束
    C3P0连接池工具类使用
    jdbc连接警告不安全
    java的unity单元测试
    BootStrap容器介绍
    validate插件实现表单效验(二)
    validate插件实现表单效验(一)
  • 原文地址:https://www.cnblogs.com/wudequn/p/8025829.html
Copyright © 2011-2022 走看看