MVC4.0 实现单一Action返回多种结果
2015-10-23 18:00
10 查看
在开发过程中,我们往往会遇到这种情况。例如:展示学生的详细信息页面,加载学生的详细信息局部视图,异步请求学生的详细信息Json数据等等。
一般情况下,我们会写三个不同的action来支撑前台数据的调用,Student(view视图)、PartialStudent(Partial视图)和JsonStudent(JsonResult视图)。从实现上,我们写的代码没有任何问题,这些功能都是我们想要的,而且代码也很整洁。
但是仔细想想,会发现三个Action执行相同的业务逻辑,唯一的区别只是返回个浏览器内容的方式不同,为了减少重复的代码,我们可以做出以下代码调整
1.仿Request.IsAjaxRequest(),给HttpRequestBase扩展一个IsPartialRequest方法,来判断是否是局部视图请求(需要Url上加一个format=partial的参数来辅助实现)
2.仿Request.IsAjaxRequest(),给HttpRequestBase扩展一个IsJsonRequest方法,来判断是否是Json请求(需要Url上加一个format=json的参数来辅助实现)
3.合并请求的逻辑代码
4.调取数据的前台代码如下:
5.我们可以看一下渲染效果
一般情况下,我们会写三个不同的action来支撑前台数据的调用,Student(view视图)、PartialStudent(Partial视图)和JsonStudent(JsonResult视图)。从实现上,我们写的代码没有任何问题,这些功能都是我们想要的,而且代码也很整洁。
但是仔细想想,会发现三个Action执行相同的业务逻辑,唯一的区别只是返回个浏览器内容的方式不同,为了减少重复的代码,我们可以做出以下代码调整
1.仿Request.IsAjaxRequest(),给HttpRequestBase扩展一个IsPartialRequest方法,来判断是否是局部视图请求(需要Url上加一个format=partial的参数来辅助实现)
public static class HttpRequestBaseExtensions { public static bool IsPartialRequest(this HttpRequestBase request) { return string.Equals(request["format"], "partial"); } }
2.仿Request.IsAjaxRequest(),给HttpRequestBase扩展一个IsJsonRequest方法,来判断是否是Json请求(需要Url上加一个format=json的参数来辅助实现)
public static class HttpRequestBaseExtensions { public static bool IsJsonRequest(this HttpRequestBase request) { return string.Equals(request["format"], "json"); } }
3.合并请求的逻辑代码
public ActionResult Student() { if (Request.IsJsonRequest()) return Json(new { Name = "我是小明" }, JsonRequestBehavior.AllowGet); if (Request.IsPartialRequest()) return PartialView("PartialStudent"); return View(new { Name = "小明", Sex = "女" }); }
4.调取数据的前台代码如下:
<body> <h3>view视图</h3> <div>我是小明</div> <h3>PartialView视图:</h3> <div id="partial"></div> <h3>Json数据:</h3> <div id="json"></div> <script src="~/Content/js/jquery-1.10.2.min.js"></script> <script type="text/javascript"> $(function () { $('#partial').load('@Url.Action("Student", "Home", new { area=string.Empty, format="partial" })'); $.post('@Url.Action("Student", "Home")', { format: 'json' }, function (res) { if (res) { $('#json').html(res.Name); } }, 'json') }) </script> </body>
5.我们可以看一下渲染效果

相关文章推荐
- android支付之微信支付
- js面向对象编程(三)非构造函数的继承
- CF div2 325 D
- Java CSV操作(导出和导入)
- 学习站点
- Android 动态加载 APK
- MySQL 改变列的数据类型为ENUM
- 【CUDA并行程序设计系列(1)】GPU技术简介
- js面向对象编程(二)构造函数的继承
- tamcat7.0(安装文件下载)
- 简单几何(线段与直线的位置) POJ 3304 Segments
- 在终端输入多行信息,找出包含“ould”的行,并打印该行
- bind相关
- VM虚拟机添加磁盘不重启系统,识别磁盘,添加到分区
- Struts2 ModelDriven和FieldDriven
- 异常处理的原则
- 数据库类型与java数据类型的对应关系
- Strace诊断CPU跑高问题
- android studio 更改背景和设置字体大小
- MySQL 可以用localhost 连接,但不能用IP连接的问题,局域网192.168.*.* 无法连接mysql