回到目录

对一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的带来!

回到目录

爱上MVC~为非法进行Action的用户提供HttpStatusCodeResult的更多相关文章

  1. 七天学会ASP.NET MVC (五)——Layout页面使用和用户角色管理

    系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 七天学会ASP.NET MVC (三)— ...

  2. asp.net mvc @Html.Partial @Html.Action @Html.RenderPartial @Html.RenderAction区别

    转载自 :  <asp.net mvc @Html.Partial @Html.Action @Html.RenderPartial @Html.RenderAction区别> 先复制过来 ...

  3. [转]ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)

    有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你创建action过滤器.Action过滤器是自定义的Attributes,用来标记添 ...

  4. 爱上MVC3~在控制器或Action上动态设定模板页(Layout)

    回到目录 很多境况下,我们需要设置自己模块的layout,即它的布局页面,在MVC2中叫它模板页面,你可以在return view方法时设置它,当然,这不是一种好方法,因为我不想每个action都去设 ...

  5. Asp.Net Mvc - 在OnResultExecut* 拦截Action返回的HTML

    在Asp.Net MVC项目中通过重写ActionFilterAttribute中的方法,我们就可以在轻松的在Action方法执行前后做一些特殊的操作如:[身份认证.日志记录.内容截取等]. 但是我们 ...

  6. 微软将向Linux用户提供SQL Server程序

    微软公司(Microsoft Corp., MSFT)将向Linux操作系统的用户提供旗下一项最赚钱的产品,这是该公司几年前无法想像的举措.这家软件巨头周一表示,将向免费的Linux Server提供 ...

  7. 9、FTP封杀用户、限制传输速率、限制访问目录、为匿名用户提供下载资源

    一.封杀某些用户访问FTP服务器 例如  封杀 yanji [root@localhost root]#   vi   /etc/vsftpd.ftpusers     (用户控制配置文件,主要用于限 ...

  8. 中国版dropbox“坚果云”和它背后的团队故事(大的优势就在于他为用户提供了设定多个文件夹的权利)

    (速途网专栏 作者:娄昊川)坚果云是一款中文存储服务,前身是“坚果铺子”,提供免费的云空间,与dropbox类似,用户可以直接把档案同步到坚果云,供自己和伙伴用任何设备访问.自上线以来,几乎所有用户都 ...

  9. drupal7 boost模块为登录用户提供缓存

    这段时间研究Drupal7的缓存相关,看了好多资料,都提到了boost和authcache两个模块,今天来说一下boost. 具体的下载安装,配置等,官网写的听清楚,boost模块地址 ,安装配置方法 ...

随机推荐

  1. 2. Abstract Factory(抽象工厂)

    意图: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性: 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关 ...

  2. 学习OpenStack之 (3):Devstack Screen 使用技巧

    Devstack环境中,openstack运行在一个screen中,每个service运行在一个window中.我总结的几个tips: 0. 注意需要使用screen启动用户来进行一下操作 1. 查看 ...

  3. golang笔记——IDE

    可选方案有 Lite IDE\GoSublime\Visual Studio Code\Goclipse\Vim 1.Lite IDE 这是国人开发的开源且跨平台的 golang 专属IDE,也算是目 ...

  4. POJ 1635 树的最小表示法/HASH

    题目链接:http://poj.org/problem?id=1635 题意:给定两个由01组成的串,0代表远离根,1代表接近根.相当于每个串对应一个有根的树.然后让你判断2个串构成的树是否是同构的. ...

  5. 异常问题解决Error:Execution failed for task &#39;:app:processDebugManifest&#39;

    Error:Execution failed for task ':app:processDebugManifest' www.MyException.Cn  网友分享于:2015-12-28  浏览 ...

  6. 解析XML的几种方法之SAX解析

    假期总结不能停,坚持坚持....接下来总结一下XMl和json的解析和生成.. 解析XML的四种方法,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址: DOM:在现 ...

  7. xml转成数组,原来这么简单!

    function xml2arr($xml){ $obj  = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); $js ...

  8. Map、Set、List、Queue、Stack的特点与用法

    Collection          接口的接口   对象的集合 ├ List                   子接口      按进入先后有序保存   可重复 │├ LinkedList    ...

  9. BZOJ 4500: 矩阵 差分约束

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4500 题解: 从行向列建边,代表一个格子a[i][j],对每个顶点的所有操作可以合并在一 ...

  10. HDU2227Find the nondecreasing subsequences(树状数组+DP)

    题目大意就是说帮你给出一个序列a,让你求出它的非递减序列有多少个. 设dp[i]表示以a[i]结尾的非递减子序列的个数,由题意我们可以写出状态转移方程: dp[i] = sum{dp[j] | 1&l ...