zoukankan      html  css  js  c++  java
  • MVC扩展ActionInvoker,自定义ActionInvoker,根据请求数据返回不同视图

    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视图:

    1


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

    2


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

    [HttpGet]
    public ActionResult SomeAction()

    [HttpPost]
    public ActionResult SomeAction()

    参考资料:
    Controller Factory and Action Invoker Part 2

  • 相关阅读:
    Linux下安装配置SVN服务器,windows访问
    Zookeeper集群版搭建
    Zookeeper单机版启动
    Nginx-Session缓存一致性-memcached
    Nginx-配置多台Tomcat-反向代理
    Linux-tomcat-安装启动
    Linux-JDK-环境搭建安装
    Nginx-安装-运行访问页面
    Linux-虚拟机-克隆-学习
    解决CocosCreator 在微信小游戏中使用Socket.io 报错的问题
  • 原文地址:https://www.cnblogs.com/darrenji/p/3747558.html
Copyright © 2011-2022 走看看