上一篇文章我们主要讲解了一些webApi和redis缓存操作,这篇文章我们主要说一些MVC相关的知识(过滤器和错误处理),及采用ajax调用webApi服务。
本篇例子采用的开发环境为:VS2010(sp1)、MVC4,所有的数据都是与webApi服务进行交互。
1、先来一张项目结构图
- LoginAttribute.cs为我们定义的Action过滤器,主要检测是否登陆。因为我们要测试sessioin共享,就做了一个登陆界面,存储用户名。
- BaseController.cs 公共控制器,主要重写OnException方法对错误捕捉。HomeController继承BaseController。
- ErrorController.cs 错误控制器
- LoginController.cs登陆控制器。
1.1、LoginAttribute.cs 过滤器
LoginAttribute继承ActionFilterAttribute并重写了OnActionExecuting方法,OnActionExecuting方法会先与控制器Action执行,因此我们可以在该方法中判断session是否为空。我们打开ActionFilterAttribute发现里面有四个方法OnActionExecuted、OnActionExecuting、OnResultExecuted、OnResultExecuting,不清楚其执行顺序的童鞋可以百度一下,这里就不用介绍了,下面直接看代码。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Common; namespace MvcApplication2.Attribute { public class LoginAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { SessionHelper session = new SessionHelper(); if (session["user"] == null) { filterContext.Result = new RedirectResult("~/Login/index"); } base.OnActionExecuting(filterContext); } } }
1.2、BaseController.cs 控制器基类
BaseController继承MVC的Controller,在BaseController.cs中我们重写OnException方法进行异常处理,我们可以记录日志,跳转错误页面等,这也我们就不用每个页面写自己的异常处理了,在BaseController中我们定义了一个SessionHelper session的变量,SessionHelper为上一篇文章介绍的基于Redis的session共享,这样只要继承BaseController的页面都可以只用该变量。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Common; namespace MvcApplication2.Controllers { public class BaseController : Controller { protected SessionHelper session = new SessionHelper(); public BaseController() { } /// <summary> /// 异常处理 /// </summary> /// <param name="filterContext"></param> protected override void OnException(ExceptionContext filterContext) { if (filterContext.HttpContext.Request.IsAjaxRequest()) { JsonResult result = new JsonResult(); result.Data = new { type = "error", data = "请求异常" }; filterContext.Result = result; } else { filterContext.Result = new RedirectResult("~/error/index"); } filterContext.ExceptionHandled = true; base.OnException(filterContext); } } }
1.3、LoginController.cs 为登陆控制器
该页面值需要填写用户名,然后把该用户名存到session中,这样webAPi项目中的Get方法也会获取到该session值(详细看上一篇博文)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Common; namespace MvcApplication2.Controllers { public class LoginController : Controller { // // GET: /Login/ public ActionResult Index() { return View(); } [HttpPost] public ActionResult LoginIn(string user) { SessionHelper session = new SessionHelper(); user = Request.Form["user"]; if (!string.IsNullOrWhiteSpace(user)) { session["user"]=user.ToString(); return RedirectToAction("index", "Home"); } return RedirectToAction("LoginIn", "Login"); } } }
1.4、HomeController.cs 展示数据控制器
HomeController继承BaseController,并且在用[Login]过滤器作用在HomeController上,这样每一个Action前都会执行LoginAttribute,判断session值是否为空,
HomeController也继承了BaseController中的错误处理,具体看代码
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using Common; using MvcApplication2.Attribute; namespace MvcApplication2.Controllers { [Login] public class HomeController : BaseController { // // GET: /Home/ public ActionResult Index() { ViewBag.User = session["user"].ToString(); return View(); } public ViewResult Add() { return View(); } public ViewResult edit(string id) { ViewBag.id = id; return View(); } public ActionResult LogOut() { session["user"] = null; return RedirectToAction("index", "Login"); } } }
视图页面就不介绍了,感兴趣的童鞋可以下载源代码查看。
1.5、ErrorController.cs 错误页面,这里就不介绍了
2、测试
2.1、MVC项目和WebApi部署
- webApi为上一篇介绍的webApi程序。
- webApiTest为本片介绍的MVC项目。
- 域名都是localhost,不牵扯跨域问题
2.2、上几张图片
1、登陆界面
2、点击登陆,进入首页面,记得打开Redis缓存服务
我们发现我们获取登陆页面的session值,并取到webApi服务中的数据,说明webApi项目的session也有值了,因为webApi项目的HttpResponseMessage Get()方法也做session值是否为空的判断,详见上一篇博客的说明。
好了项目就写到这里吧,我只实现了数据的获取和数据修改功能,增加和删除没有实现。如果你感兴趣欢迎交流学习。
点击下载源代码
每天学习一点点,每天进步一点点。