回到目录

对一MVC来说,它有Controller和Action,其中Action用来为页面提供数据和相关逻辑,并最后将页面渲染出来,而有些action是需要一些参数的,如文章的最终页,可能需要一个ID,而这个ID通常是和某个链接集成在一起的,不需要浏览者手动在URL上改,而有些被称为无聊的用户或者马虎的程序员就把ID参数忽略了,这时,我们的action一般是直接抛出Exception,而这对于一个页面来说,并不是很优雅,对于一个WEB请求,应该返回一个HttpStatusCodeResult的状态结果,这个对象在WebApi中使用的比较频繁.

HttpStatusCodeResult对象结构如下

// 摘要:
    //     提供一种用于返回带特定 HTTP 响应状态代码和说明的操作结果的方法。
    public class HttpStatusCodeResult : ActionResult
    {
        // 摘要:
        //     使用状态代码初始化 System.Web.Mvc.HttpStatusCodeResult 类的新实例。
        //
        // 参数:
        //   statusCode:
        //     状态代码。
        public HttpStatusCodeResult(HttpStatusCode statusCode);
        //
        // 摘要:
        //     使用状态代码初始化 System.Web.Mvc.HttpStatusCodeResult 类的新实例。
        //
        // 参数:
        //   statusCode:
        //     状态代码。
        public HttpStatusCodeResult(int statusCode);
        //
        // 摘要:
        //     使用状态代码和状态说明初始化 System.Web.Mvc.HttpStatusCodeResult 类的新实例。
        //
        // 参数:
        //   statusCode:
        //     状态代码。
        //
        //   statusDescription:
        //     状态说明。
        public HttpStatusCodeResult(HttpStatusCode statusCode, string statusDescription);
        //
        // 摘要:
        //     使用状态代码和状态说明初始化 System.Web.Mvc.HttpStatusCodeResult 类的新实例。
        //
        // 参数:
        //   statusCode:
        //     状态代码。
        //
        //   statusDescription:
        //     状态说明。
        public HttpStatusCodeResult(int statusCode, string statusDescription);

        // 摘要:
        //     获取 HTTP 状态代码。
        //
        // 返回结果:
        //     HTTP 状态代码。
        public int StatusCode { get; }
        //
        // 摘要:
        //     获取 HTTP 状态说明。
        //
        // 返回结果:
        //     HTTP 状态说明。
        public string StatusDescription { get; }

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

HttpStatusCode是一个枚举类型,我们经常见到了404,500等HTTP请求码,都可以在这里枚举里找到

    // 摘要:
    //     包含为 HTTP 定义的状态代码的值。
    public enum HttpStatusCode
    {
        // 摘要:
        //     等效于 HTTP 状态 100。 System.Net.HttpStatusCode.Continue 指示客户端可能继续其请求。
        Continue = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 101。 System.Net.HttpStatusCode.SwitchingProtocols 指示正在更改协议版本或协议。
        SwitchingProtocols = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 200。 System.Net.HttpStatusCode.OK 指示请求成功,且请求的信息包含在响应中。 这是最常接收的状态代码。
        OK = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 201。 System.Net.HttpStatusCode.Created 指示请求导致在响应被发送前创建新资源。
        Created = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 202。 System.Net.HttpStatusCode.Accepted 指示请求已被接受做进一步处理。
        Accepted = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 203。 System.Net.HttpStatusCode.NonAuthoritativeInformation 指示返回的元信息来自缓存副本而不是原始服务器,因此可能不正确。
        NonAuthoritativeInformation = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 204。 System.Net.HttpStatusCode.NoContent 指示已成功处理请求并且响应已被设定为无内容。
        NoContent = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 205。 System.Net.HttpStatusCode.ResetContent 指示客户端应重置(或重新加载)当前资源。
        ResetContent = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 206。 System.Net.HttpStatusCode.PartialContent 指示响应是包括字节范围的 GET
        //     请求所请求的部分响应。
        PartialContent = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 300。 System.Net.HttpStatusCode.MultipleChoices 指示请求的信息有多种表示形式。
        //     默认操作是将此状态视为重定向,并遵循与此响应关联的 Location 标头的内容。
        MultipleChoices = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 300。 System.Net.HttpStatusCode.Ambiguous 指示请求的信息有多种表示形式。 默认操作是将此状态视为重定向,并遵循与此响应关联的
        //     Location 标头的内容。
        Ambiguous = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 301。 System.Net.HttpStatusCode.MovedPermanently 指示请求的信息已移到 Location
        //     头中指定的 URI 处。 接收到此状态时的默认操作为遵循与响应关联的 Location 头。
        MovedPermanently = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 301。 System.Net.HttpStatusCode.Moved 指示请求的信息已移到 Location 头中指定的
        //     URI 处。 接收到此状态时的默认操作为遵循与响应关联的 Location 头。 原始请求方法为 POST 时,重定向的请求将使用 GET 方法。
        Moved = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 302。 System.Net.HttpStatusCode.Found 指示请求的信息位于 Location 头中指定的
        //     URI 处。 接收到此状态时的默认操作为遵循与响应关联的 Location 头。 原始请求方法为 POST 时,重定向的请求将使用 GET 方法。
        Found = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 302。 System.Net.HttpStatusCode.Redirect 指示请求的信息位于 Location 头中指定的
        //     URI 处。 接收到此状态时的默认操作为遵循与响应关联的 Location 头。 原始请求方法为 POST 时,重定向的请求将使用 GET 方法。
        Redirect = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 303。 作为 POST 的结果,System.Net.HttpStatusCode.SeeOther 将客户端自动重定向到
        //     Location 头中指定的 URI。 用 GET 生成对 Location 标头所指定的资源的请求。
        SeeOther = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 303。 作为 POST 的结果,System.Net.HttpStatusCode.RedirectMethod 将客户端自动重定向到
        //     Location 头中指定的 URI。 用 GET 生成对 Location 标头所指定的资源的请求。
        RedirectMethod = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 304。 System.Net.HttpStatusCode.NotModified 指示客户端的缓存副本是最新的。 未传输此资源的内容。
        NotModified = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 305。 System.Net.HttpStatusCode.UseProxy 指示请求应使用位于 Location 头中指定的
        //     URI 的代理服务器。
        UseProxy = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 306。 System.Net.HttpStatusCode.Unused 是未完全指定的 HTTP/1.1 规范的建议扩展。
        Unused = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 307。 System.Net.HttpStatusCode.RedirectKeepVerb 指示请求信息位于 Location
        //     头中指定的 URI 处。 接收到此状态时的默认操作为遵循与响应关联的 Location 头。 原始请求方法为 POST 时,重定向的请求还将使用
        //     POST 方法。
        RedirectKeepVerb = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 307。 System.Net.HttpStatusCode.TemporaryRedirect 指示请求信息位于 Location
        //     头中指定的 URI 处。 接收到此状态时的默认操作为遵循与响应关联的 Location 头。 原始请求方法为 POST 时,重定向的请求还将使用
        //     POST 方法。
        TemporaryRedirect = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 400。 System.Net.HttpStatusCode.BadRequest 指示服务器未能识别请求。 如果没有其他适用的错误,或者不知道准确的错误或错误没有自己的错误代码,则发送
        //     System.Net.HttpStatusCode.BadRequest。
        BadRequest = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 401。 System.Net.HttpStatusCode.Unauthorized 指示请求的资源要求身份验证。 WWW-Authenticate
        //     头包含如何执行身份验证的详细信息。
        Unauthorized = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 402。 保留 System.Net.HttpStatusCode.PaymentRequired 以供将来使用。
        PaymentRequired = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 403。 System.Net.HttpStatusCode.Forbidden 指示服务器拒绝满足请求。
        Forbidden = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 404。 System.Net.HttpStatusCode.NotFound 指示请求的资源不在服务器上。
        NotFound = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 405。 System.Net.HttpStatusCode.MethodNotAllowed 指示请求的资源上不允许请求方法(POST
        //     或 GET)。
        MethodNotAllowed = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 406。 System.Net.HttpStatusCode.NotAcceptable 指示客户端已用 Accept 头指示将不接受资源的任何可用表示形式。
        NotAcceptable = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 407。 System.Net.HttpStatusCode.ProxyAuthenticationRequired 指示请求的代理要求身份验证。
        //     Proxy-authenticate 头包含如何执行身份验证的详细信息。
        ProxyAuthenticationRequired = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 408。 System.Net.HttpStatusCode.RequestTimeout 指示客户端没有在服务器期望请求的时间内发送请求。
        RequestTimeout = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 409。 System.Net.HttpStatusCode.Conflict 指示由于服务器上的冲突而未能执行请求。
        Conflict = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 410。 System.Net.HttpStatusCode.Gone 指示请求的资源不再可用。
        Gone = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 411。 System.Net.HttpStatusCode.LengthRequired 指示缺少必需的 Content-length
        //     头。
        LengthRequired = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 412。 System.Net.HttpStatusCode.PreconditionFailed 指示为此请求设置的条件失败,且无法执行此请求。
        //     条件是用条件请求标头(如 If-Match、If-None-Match 或 If-Unmodified-Since)设置的。
        PreconditionFailed = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 413。 System.Net.HttpStatusCode.RequestEntityTooLarge 指示请求太大,服务器无法处理。
        RequestEntityTooLarge = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 414。 System.Net.HttpStatusCode.RequestUriTooLong 指示 URI 太长。
        RequestUriTooLong = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 415。 System.Net.HttpStatusCode.UnsupportedMediaType 指示请求是不支持的类型。
        UnsupportedMediaType = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 416。 System.Net.HttpStatusCode.RequestedRangeNotSatisfiable 指示无法返回从资源请求的数据范围,因为范围的开头在资源的开头之前,或因为范围的结尾在资源的结尾之后。
        RequestedRangeNotSatisfiable = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 417。 System.Net.HttpStatusCode.ExpectationFailed 指示服务器未能符合 Expect
        //     头中给定的预期值。
        ExpectationFailed = ,
        //
        UpgradeRequired = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 500。 System.Net.HttpStatusCode.InternalServerError 指示服务器上发生了一般错误。
        InternalServerError = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 501。 System.Net.HttpStatusCode.NotImplemented 指示服务器不支持请求的函数。
        NotImplemented = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 502。 System.Net.HttpStatusCode.BadGateway 指示中间代理服务器从另一代理或原始服务器接收到错误响应。
        BadGateway = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 503。 System.Net.HttpStatusCode.ServiceUnavailable 指示服务器暂时不可用,通常是由于过多加载或维护。
        ServiceUnavailable = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 504。 System.Net.HttpStatusCode.GatewayTimeout 指示中间代理服务器在等待来自另一个代理或原始服务器的响应时已超时。
        GatewayTimeout = ,
        //
        // 摘要:
        //     等效于 HTTP 状态 505。 System.Net.HttpStatusCode.HttpVersionNotSupported 指示服务器不支持请求的
        //     HTTP 版本。
        HttpVersionNotSupported = ,
    }

让我们在Action中使用它,看一下程序修改后的样式吧

    public  ActionResult Details(int? id)
        {
            //参数不正确,直接抛出对应的HttpStatusCodeResult结果
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            //你的逻辑
            return View();
        }

结果截图

在进行MVC4之后,它同样支持异步Action,即它在独立的线程中运行,而不会使用主WEB线程阻塞

   public async Task<ActionResult> Details(int? id)
        {
            //参数不正确,直接抛出对应的HttpStatusCodeResult结果
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            //你的逻辑
            return View();
        }

对于MVC的研究,我们还在继续,等待MVC5的带来!

回到目录

随机推荐

  1. 【Win 10应用开发】在RichEditBox中使用自定义菜单

    前面给大伙儿简单介绍了RichEditBox控件的基本用法,以及解决其中的一些小问题. 本文咱们来看看如何自定义RichEditBox控件的上下文菜单. 原理比较简单,所以先说一说原理.当RichEd ...

  2. 第一届山东省ACM——Phone Number(java)

    Description We know that if a phone number A is another phone number B’s prefix, B is not able to be ...

  3. FTP服务器原理

    21.1 FTP服务器原理   使用明码传输方式,且有相当多的安全危机历史.因此一般使用功能较少的vsftpd这个软件.   21.1.1 FTP功能简介   有以下功能 文档传输与管理 不同等级的用 ...

  4. [PL/SQL]使用PL/SQL实现ORACLE的Excel格式导入导出

    注:教程所使用的PL/SQL Developer版本为10版本 1.oracle导出excel格式 第一步,在pl/sql窗口查询出你想要导出的数据. 第二步,选择你想导出的数据,然后右键" ...

  5. Linux Gitlab

    一.简介 GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能,能够浏览源 ...

  6. 对css中clear元素的理解

    clear:left;表示左侧不能有浮动元素. clear:right;表示右侧不能有浮动元素. clear:both;表示左右两侧都不能有浮动元素. 但在使用时,还得考虑css优先级问题.相同类型选 ...

  7. SBT 构建scala eclipse开发

    scala eclipse sbt 应用程序开发 搭建Eclipse开发Scala应用程序的一般步骤 一.环境准备: 1.Scala : http://www.scala-lang.org/ 2.Sc ...

  8. Android keystore 密码忘记了的找回办法

    keystore密码忘记了,准备给自己的应用发布一个新版本,在apk打包时,发现之前的用的keystore密码忘了.如果换一个keystore,则之前已经安装应用的用户就必须手工卸载原应用才能安装,非 ...

  9. Grasshopper 2.0 MP Color FireWire 1394b (Sony ICX274)

        相机参数如下,参见这里: Resolution 1624 x 1224 Frame Rate 30 FPS Megapixels 2.0 MP Chroma Color Sensor Name ...

  10. 错误记录--The import XXX cannot be resolved

    错误:The import XXX cannot be resolved弄了好久,import类的都没问题,但就是报错.选择project --> clean后,OK.如果还不行,删掉全部imp ...