博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC扩展ActionInvoker,自定义ActionInvoker,根据请求数据返回不同视图
阅读量:7283 次
发布时间:2019-06-30

本文共 2271 字,大约阅读时间需要 7 分钟。

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";
}
 

DemoGet

 
@using (Html.BeginForm("Demo", "Home", FormMethod.Post, new {id = "form1"}))
{
}
 
@section scripts
{
$(function() {
$('#submit').click(function() {
var name = $('#name').val();
var url = $('#form1').attr('action');
url = url + '?name=' + name;
$('#form1').attr('action', url);
});
});
 
}

 

DemoPost.cshtml视图为:

@{
ViewBag.Title = "DemoPost";
Layout = "~/Views/Shared/_Layout.cshtml";
}
 

DemoPost

@{ 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()

 

参考资料:

转载地址:http://pbkjm.baihongyu.com/

你可能感兴趣的文章
Maven 在eclispe中集成本地插件报错解决方案
查看>>
Ubuntu中必装的十个应用程序
查看>>
Object-c 单例模式中的 allocWithZone作用
查看>>
分享一个H5原生form表单的checkbox特效
查看>>
nodejs+npm+webpack+vue+ElementUI+vue-route
查看>>
JAVA编程插入Excel文件到Word数据区域
查看>>
Highcharts 3.0.8功能特性使用评测
查看>>
大型分布式网站架构实战项目分析
查看>>
python 图片处理 窗体
查看>>
build tesseract opencv
查看>>
Android7.0使用Intent打开文件
查看>>
jQuery操作radio、checkbox、select总结
查看>>
Studio for WinForms:绑定甘特图表数据源
查看>>
zookeeper(一)
查看>>
centos7安装node方式整理记录~
查看>>
游戏开发--开源软件6--LimeJS(javascript)||Gamvas||gamejs
查看>>
Android四种常用的消息传递机制/模式的比较
查看>>
我的友情链接
查看>>
五虎遁月 和 五鼠遁时 法
查看>>
很好的一个blog,记录一下
查看>>