MVC扩展ActionInvoker,自定义ActionInvoker,根据请求数据返回不同视图
2014-05-23 13:48
363 查看
ActionInvoker的作用是:根据请求数据(HttpPost,HttpGet等)和action名称,来激发响应的action,再由action渲染视图。本文通过自定义ActionInvoker,根据请求类型直接渲染视图。
控制器中有这样的一个Action:
publicActionResultDemo()
{
returnView();
}
当请求该action的时候,我们希望:如果是Get请求,我们直接渲染视图DemoGet.cshtml;如果是Post请求,我们直接渲染视图DemoPost.cshtml。于是,我们需要扩展默认的ControllerActionInvoker类。
[code]
[/code]
在控制器的构造函数中启用自定义ActionInvoker。
[code]{
[/code]
DemoGet.cshtml视图为:
[code]ViewBag.Title="DemoGet";
[/code]
DemoPost.cshtml视图为:
[code]ViewBag.Title="DemoPost";
[/code]
当在浏览器中输入:/Home/Demo的时候,是Get请求,返回DemoGet.cshtml视图:
当点击提交按钮,对/Home/Demo的是Post请求,返回DemoPost.cshtml视图:
小结:
对于某个控制器方法,可以根据请求数据(有可能是GET,POST,也有可能是其它请求数据,因为可以从HttpContext.Current.Request中拿到很多请求数据)的不同,直接渲染出视图。不一定通过如下方式:
[HttpGet]
publicActionResultSomeAction()
[HttpPost]
publicActionResultSomeAction()
参考资料:
ControllerFactoryandActionInvokerPart2
控制器中有这样的一个Action:
publicActionResultDemo()
{
returnView();
}
当请求该action的时候,我们希望:如果是Get请求,我们直接渲染视图DemoGet.cshtml;如果是Post请求,我们直接渲染视图DemoPost.cshtml。于是,我们需要扩展默认的ControllerActionInvoker类。
usingSystem.Web.Mvc;
[code]
namespaceMvcApplication1.Extension
{
publicclassMyActionInvoker:ControllerActionInvoker
{
publicoverrideboolInvokeAction(ControllerContextcontrollerContext,stringactionName)
{
if(controllerContext.HttpContext.Request.RequestType=="GET"&&actionName=="Demo")
{
ViewResultviewResult=newViewResult();
viewResult.View=viewResult.ViewEngineCollection.FindView(controllerContext,"DemoGet",null).View;
InvokeActionResult(controllerContext,viewResult);
returntrue;
}
elseif(controllerContext.HttpContext.Request.RequestType=="POST"&&actionName=="Demo")
{
ViewResultviewResult=newViewResult();
viewResult.View=viewResult.ViewEngineCollection.FindView(controllerContext,"DemoPost",null).View;
InvokeActionResult(controllerContext,viewResult);
returntrue;
}
else
{
returnbase.InvokeAction(controllerContext,actionName);
}
}
}
}
[/code]
在控制器的构造函数中启用自定义ActionInvoker。
publicHomeController()
[code]{
this.ActionInvoker=newMyActionInvoker();
}
[/code]
DemoGet.cshtml视图为:
@{
[code]ViewBag.Title="DemoGet";
Layout="~/Views/Shared/_Layout.cshtml";
}
<h2>DemoGet</h2>
@using(Html.BeginForm("Demo","Home",FormMethod.Post,new{id="form1"}))
{
<inputtype="text"name="name"id="name"/>
<inputtype="submit"value="提交"name="submit"id="submit"/>
}
@sectionscripts
{
<scripttype="text/javascript">
$(function(){
$('#submit').click(function(){
varname=$('#name').val();
varurl=$('#form1').attr('action');
url=url+'?name='+name;
$('#form1').attr('action',url);
});
});
</script>
}
[/code]
DemoPost.cshtml视图为:
@{
[code]ViewBag.Title="DemoPost";
Layout="~/Views/Shared/_Layout.cshtml";
}
<h2>DemoPost</h2>
@{stringname=string.Empty;}
@if(HttpContext.Current.Request.QueryString["name"]!=null)
{
name=HttpContext.Current.Request.QueryString["name"].ToString();
}
@name
[/code]
当在浏览器中输入:/Home/Demo的时候,是Get请求,返回DemoGet.cshtml视图:
当点击提交按钮,对/Home/Demo的是Post请求,返回DemoPost.cshtml视图:
小结:
对于某个控制器方法,可以根据请求数据(有可能是GET,POST,也有可能是其它请求数据,因为可以从HttpContext.Current.Request中拿到很多请求数据)的不同,直接渲染出视图。不一定通过如下方式:
[HttpGet]
publicActionResultSomeAction()
[HttpPost]
publicActionResultSomeAction()
参考资料:
相关文章推荐
- Spring MVC Controller 的同一个 URL 请求,根据逻辑判断返回 JSON 或者 HTML 视图
- 根据网络请求结果返回加载失败、加载为空、加载成功、加载中的自定义视图
- Spring MVC根据请求后缀返回不同数据格式
- 如何让 Spring MVC Controller 的同一个 URL 请求,根据逻辑判断返回 JSON 或者 HTML 视图?
- 如何让 Spring MVC Controller 的同一个 URL 请求,根据逻辑判断返回 JSON 或者 HTML 视图?
- MVC 用扩展方法执行自定义视图,替代 UIHint
- spring mvc ajax 请求返回json数据
- android retrofit 实战自定义converter,解决相同接口返回不同数据的问题
- SpringMVC ContentNegotiatingViewResolver -- 根据请求资源名选择视图
- 如何让Spring MVC Controller的同一个方法,根据逻辑判断返回JSON或者HTML视图?
- MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult
- 在Spring MVC Controller的同一个方法中,根据App还是WEB返回JSON或者HTML视图。
- Asp.net mvc返回Xml结果,扩展Controller实现XmlResult以返回XML格式数据
- Spring mvc ContentNegotiatingViewResolver 根据路径后缀,选择不同视图
- MVC扩展控制器工厂,通过实现IControllerFactory,根据action名称生成不同的Controller
- spring mvc 针对不同请求头返回不同的视图
- [Phonegap+Sencha Touch] 移动开发48 扩展的NavigationView控件,支持根据不同的View显示不同的顶栏按钮、不同的屏幕方向,增加视图缓存机制
- 润乾报表根据数据的不同扩展出列宽不同的格子
- 自定义View 01 --网络请求返回数据为空时的提示界面
- SpringSecurity学习四-自定义Login请求和返回的数据格式