ActionInvoker的作用是:根据请求数据(HttpPost,HttpGet等)和action名称,来激发响应的action,再由action渲染视图。本文通过自定义ActionInvoker,根据请求类型直接渲染视图。

控制器中有这样的一个Action:

public ActionResult Demo()
        {
            return View();
        }

当请求该action的时候,我们希望:如果是Get请求,我们直接渲染视图DemoGet.cshtml;如果是Post请求,我们直接渲染视图DemoPost.cshtml。于是,我们需要扩展默认的ControllerActionInvoker类。

using System.Web.Mvc;
 
namespace MvcApplication1.Extension
{
    public class MyActionInvoker : ControllerActionInvoker
    {
        public override bool InvokeAction(ControllerContext controllerContext, string actionName)
        {
            if (controllerContext.HttpContext.Request.RequestType == "GET" && actionName == "Demo")
            {
                ViewResult viewResult = new ViewResult();
                viewResult.View = viewResult.ViewEngineCollection.FindView(controllerContext, "DemoGet", null).View;
                InvokeActionResult(controllerContext, viewResult);
                return true;
            }
            else if (controllerContext.HttpContext.Request.RequestType == "POST" && actionName == "Demo")
            {
                ViewResult viewResult = new ViewResult();
                viewResult.View = viewResult.ViewEngineCollection.FindView(controllerContext, "DemoPost", null).View;
                InvokeActionResult(controllerContext, viewResult);
                return true;
            }
            else
            {
                return base.InvokeAction(controllerContext, actionName);
            }
            
        }
    }
}
 

在控制器的构造函数中启用自定义ActionInvoker。

        public HomeController()
        {
            this.ActionInvoker = new MyActionInvoker();
        }

DemoGet.cshtml视图为:

@{
    ViewBag.Title = "DemoGet";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
 
<h2>DemoGet</h2>
 
@using (Html.BeginForm("Demo", "Home", FormMethod.Post, new {id = "form1"}))
{
    <input type="text" name="name" id="name"/>
    <input type="submit" value="提交" name="submit" id="submit"/>
}
 
@section scripts
{
    <script type="text/javascript">
        $(function() {
            $('#submit').click(function() {
                var name = $('#name').val();
                var url = $('#form1').attr('action');
                url = url + '?name=' + name;
                $('#form1').attr('action', url);
            });
        });
    </script>
}

DemoPost.cshtml视图为:

@{
    ViewBag.Title = "DemoPost";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
 
<h2>DemoPost</h2>
@{ string name = string.Empty;}
@if (HttpContext.Current.Request.QueryString["name"] != null)
{
    name = HttpContext.Current.Request.QueryString["name"].ToString();
}
 
@name
 

当在浏览器中输入:/Home/Demo的时候,是Get请求,返回DemoGet.cshtml视图:

当点击提交按钮,对/Home/Demo的是Post请求,返回DemoPost.cshtml视图:

小结:

对于某个控制器方法,可以根据请求数据(有可能是GET,POST,也有可能是其它请求数据,因为可以从HttpContext.Current.Request中拿到很多请求数据)的不同,直接渲染出视图。不一定通过如下方式:

[HttpGet]

public ActionResult SomeAction()

[HttpPost]

public ActionResult SomeAction()

参考资料:

Controller Factory and Action Invoker Part 2

MVC扩展ActionInvoker,自定义ActionInvoker,根据请求数据返回不同视图的更多相关文章

  1. 09.VUE学习之watch监听属性变化实现类百度搜索栏功能ajax异步请求数据,返回字符串

    cmd下安装axios npm install axios 安装好后,会多出node_modules文件夹 思路: 监听data里的word改变时,发送ajax异步请求数据, 把返回的数据赋值给dat ...

  2. django view 视图控制之数据返回的视图函数

    八.视图 view 概述:views.py定义的python函数,它接受Web请求并且返回Web响应. 有几个页面就有几个视图view user出入url地址,发送request--->urls ...

  3. 09.1.VUE学习之watch监听属性变化实现类百度搜索栏功能ajax异步请求数据,返回数组

    09.1html里 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  4. spring mvc 通过拦截器记录请求数据和响应数据

    spring mvc 能过拦截器记录请求数据记录有很多种方式,主要有以下三种: 1:过滤器 2:HandlerInterceptor拦截器 3:Aspect接口控制器 但是就我个人所知要记录返回的数据 ...

  5. 关于Http请求后返回json乱码的问题

    其实很多时候我们在做http请求数据返回的时候经常会莫名发现会出现乱码,大部分时候我们都觉得是编码不对造成的. 一般情况下正常我们默认都是作个很简单的操作,直接使用UTF-8编码基本问题就搞定了 Ht ...

  6. SpringMVC总结三:请求Controller返回视图类型以及请求方式、参数介绍

    视图解析,请求Controller返回的视图类型: @Controller @RequestMapping("/test") public class TestController ...

  7. Struts2 请求数据的自动封装 及 自定义转换器类

    请求数据自动封装: 实现原理:使用了参数拦截器.struts-default.xml中 <interceptor name="params" class="com. ...

  8. vue使用element Transfer 穿梭框实现ajax请求数据和自定义查询

    vue使用element Transfer 穿梭框实现ajax请求数据和自定义查询 基于element Transfer http://element-cn.eleme.io/#/zh-CN/comp ...

  9. 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回

    作者:ssslinppp      时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...

随机推荐

  1. Unix IPC之读写锁

    linux中读写锁的rwlock介绍 读写锁比mutex有更高的适用性,可以多个线程同时占用读模式的读写锁,但是只能一个线程占用写模式的读写锁: 1,当读写锁是写加锁状态时, 在这个锁被解锁之前, 所 ...

  2. SQL之DELETE

    在SQL中DELETE语句用于删除表中的行. 语法 1.删除特定行 DELETE FROM 表名称 WHERE 列名称 = 值 2.删除所有行:在不删除表的情况下删除所有的行.删除之后表的结构.属性和 ...

  3. Hive SQL综合案例

    一 Hive SQL练习之影评案例 案例说明 现有如此三份数据:1.users.dat 数据格式为: 2::M::56::16::70072, 共有6040条数据对应字段为:UserID BigInt ...

  4. 【POJ】1286.Necklace of Beads

    题解 群论,我们只要找出所有的置换群的所有循环节 具体可参照算法艺术与信息学竞赛 旋转的置换有n个,每一个的循环节个数是gcd(N,i),i的范围是0到N - 1 翻转,对于奇数来说固定一个点,然后剩 ...

  5. LoadRunner参数化时的中文乱码问题

    http://blog.sina.com.cn/s/blog_6cf205160100mdxi.html

  6. xshell连接不上linux问题

    1.首先确定linux系统有网络. 使用ipconfig查看是否有ip地址,没有的话需要先配置. 2.打开sshd服务:service sshd start 3.关闭防火墙服务:service ipt ...

  7. 2011年入侵 Kernel.org 的黑客被捕 面临10年监禁

    2011年中旬,Linux内核官网kernel.org遭到黑客入侵,攻击者植入了rootkit Phalanx,并在服务器上设置了SSH后门,kernel.org为此关闭了三周多时间.官方表示将会公开 ...

  8. linux网络管理----远程登录工具

    1.对称加密 例子:压缩文件加密码,别人要打开,只能知道你的密码,这样的方法不安全,因为这个密码可能是你的qq密码或者是邮箱密码等等 2.非对称加密 类似于放羽毛球的桶,两边都可以拿资源,两边都加一个 ...

  9. poj3349(hash table)

    做的第一道哈希表的题目.速度很慢,跑了3000+ms.采用六条边的和对一个大质数的余数作为哈希表的key,理论上质数取得越大,消耗的空间就越大,但是速度会加快,这里取了14997.地址冲突用链表解决. ...

  10. [ 原创 ]学习笔记-做一个Android音乐播放器是遇到的一些困难

    最近再做一个安卓的音乐播放器,是实验室里学长派的任务,我是在eclipse上进行开发的,由于没有android的基础,所以做起来困难重重. 首先是布局上的困难 1.layout里的控件属性不熟悉 2. ...