1、登录页面代码:

  1. @{
  2. ViewBag.Title = "会员登录";
  3. Layout = "~/Views/Shared/_LayoutDialog.cshtml";
  4. }
  5.  
  6. <div class="loginBox">
  7. <div class="loginHead" >
  8. 会员登录
  9. </div>
  10. <form id="hgl-form" class="form-horizontal" action="@Url.Action("Login", "Home", new { area = string.Empty })" method="post">
  11. <div class="control-group">
  12. <label for="inputEmail">账户</label>
  13. <input type="text" name="account" id="inputEmail" class="validate[required]" />
  14. </div>
  15. <div class="control-group">
  16. <label for="inputPassword">密码</label>
  17. <input type="password" name="password" id="inputPassword" class="validate[required]" />
  18. </div>
  19. @*<div class="control-group" >
  20. <label class="checkbox">
  21. <input type="checkbox" name="rememberMe" checked>
  22. 记住我</label>
  23. </div>*@
  24. <div class="form-actions">
  25. <button type="submit" class="btn btn-block">登录</button>
  26. </div>
  27. </form>
  28.  
  29. </div>
  30.  
  31. @section scripts{
        <script type="text/javascript">
            $(function () {
                //表单提交
                hgl.sumbit(function () {
                    location.href = '@Url.Action("Index", "SiteSet", new { area = "Setting" })';//登陆成功后跳转到的页面
                });
            })
        </script>
    }

  2、登录controller代码:

  1. //会员登录
  2. [HttpGet]
  3. public ActionResult Login()
  4. {
  5. return View();
  6. }
  7.  
  8. [HttpPost]
  9. public ActionResult Login(string account, string password)
  10. {
  11. var entity = AdminService.QueryDetailForAccount(account);
  12. if (entity == null)
  13. return JRFaild("all", "此账户不存在");
  14.  
  15. if (entity.Password != password.ToMD5())
  16. return JRFaild("all", "账户密码输入错误,请重新输入");
  17.  
  18. if (entity.Freezed == 1)
  19. return JRFaild("all", "此账户已被冻结,暂不能登录,请联系超级管理员");
  20.  
  21. var result = AdminService.Login(account, password, entity);
  22.  
  23. if (result)
  24. {
  25. Session["account"] = account;
                    Session["guid"] = entity.Guid;
                    Session["username"] = entity.Name;
                    Session["password"] = password;
  26.  
  27. return JRSuccess("登录成功");
  28. }
  29.  
  30. return JRFaild("all", "登录失败,用户名或密码错误或账户不存在");
  31. }

  前面是登录模块的代码;下面主要介绍 ActionFilterAttribute过滤器的使用

1、在项目中新建个Filter文件夹,在文件夹里面添加该过滤器类,命名为:BasicAuthAttribute.cs;此类需要继承ActionFilterAttribute(关于ActionFilterAttribute大家可以按F12跳转到该类的详细介绍进行了解和使用);我在新建的BasicAuthAttribute.cs中使用了OnActionExecuting,该类代码如下:如下代码在使用的时候还需要添加引用:

  1. using System.Web.Mvc;
  2. using System.Web.Routing;
  3. using System.Web.Security;
  1. namespace Linkin.Manager.Filter
  2. {
  3. public class BasicAuthAttribute : ActionFilterAttribute
  4. {
  5. public override void OnActionExecuting(ActionExecutingContext filterContext)
  6. {
  7. var account = filterContext.HttpContext.Session["account"];
                var password = filterContext.HttpContext.Session["password"];
                if (account == null || password == null)
  8. {
  9. //用户不登陆的时候跳转到登录页面
  10. filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "Login", area = string.Empty }));
  11. }
  12. }
  13. }
  14. }

到此为止,过滤器已经写好了,具体的项可以直接F12到起定义进行查看,可以看出当用户不登陆的时候会跳转到登录页面

2、此时需要到配置文件里的登录配置是怎么配置的,打开web.config,找到节点<authentication mode="Forms"></authentication>查看配置,如果自己的登录页面跟web.config里面的配置一样就不需要修改了,不一致的最好修改一下

  1. <!--这里配置的是登录页面的权限配置-->
  2. <authentication mode="Forms">
  3. <forms loginUrl="~/Home/Login" timeout="2880" />
  4. </authentication>

3、这样以后在controller里面就可以直接用该过滤器了,在要使用此项过滤器的controller里面直接加入下面的红色字体,此时这样还需要引入该文件的引用:using Linkin.Manager.Filter;(此引用要根据自己的项目的实际情况来添加)代码如下:

  1. [BasicAuthAttribute]
  2. public class AdminController : BasicController
  3. {
  4. [HttpGet]
  5. public ActionResult Index(string id, string key, int state = -1, int page = 1)
  6. {
  7. ViewBag.Id = id;
  8. ViewBag.Key = key;
  9. ViewBag.State = state;
  10. return View(AdminService.QueryPageList(id, key, state, page, 10));
  11. }
  12. }

上面的代码是将起放到了外面,也可以将起直接放到里面,如下:

  1. public class AdminController : BasicController
  2. {
  3. [BasicAuthAttribute]
  4. [HttpGet]
  5. public ActionResult Index(string id, string key, int state = -1, int page = 1)
  6. {
  7. ViewBag.Id = id;
  8. ViewBag.Key = key;
  9. ViewBag.State = state;
  10. return View(AdminService.QueryPageList(id, key, state, page, 10));
  11. }
  12. }

4、经过以上的步骤就弄好了,此时运行网站,在不登陆的时候,直接在浏览器的地址栏输入http://localhost:2341/setting/admin,此时可以看到页面跳转到了登录页面

MVC之ActionFilterAttribute的更多相关文章

  1. MVC中ActionFilterAttribute用法并实现统一授权

    MVC中ActionFilterAttribute经常用来处理权限或者统一操作时的问题. 先写一个简单的例子,如下: 比如现在有一个用户管理中心,而这个用户管理中心需要登录授权后才能进去操作或浏览信息 ...

  2. mvc通过ActionFilterAttribute做登录检查

    1.0 创建Attribute using System; using System.Collections.Generic; using System.Linq; using System.Web; ...

  3. 创建一个ASP.NET MVC OutputCache ActionFilterAttribute

    在每一个web应用程序中, 有的情况下,你想在一段时间内缓存一个具体的页面HTML输出,因为相关的数据和处理并不是总是变化.这种缓存的响应是储存在服务器的内存中.因为没有必要的额外处理,它提供了非常快 ...

  4. ASP.NET MVC 利用ActionFilterAttribute来做权限等

    ActionFilterAttribute是Action过滤类,该属于会在执行一个action之前先执行.而ActionFilterAttribute是 MVC的一个专门处理action过滤的类.基于 ...

  5. MVC 过滤器 ActionFilterAttribute

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  6. ASP.NET MVC 通过ActionFilterAttribute来实现防止重复提交

    实现思想:每个页面打开的时候会在页面的隐藏控件自动生成一个值并将这个值赋值session,当提交方法的时候会在过滤器的时候进行获取session和页面传值过来的隐藏控件的值进行比较,如果值相同的话,重 ...

  7. MVC之ActionFilterAttribute自定义属性

    ActionFilterAttribute里有OnActionExecuting方法,跟Controller一样, 同是抽象实现了IActionFilter接口. // 登录认证特性 public c ...

  8. MVC过滤器-->ActionFilterAttribute和HandleErrorAttribute

    自定义的action过滤器  需要继承自ActionFilterAttribute 接口 OnActionExecuting:  在方法执行之前执行 OnActionExecuted:  方法的逻辑代 ...

  9. mvc 4 ActionFilterAttribute 特性,进行权限验证

    权限验证: /// <summary> /// 管理员身份验证 /// </summary> public class BasicAuthenticationAttribute ...

随机推荐

  1. css样式获取及兼容性(原生js)

    类选择器兼容性 getbyclass()类选择器,在IE8及以下均不可用. // 类选择器的兼容性 function getbyclass(parentName,Name){ var parentNa ...

  2. anime.js 实战:实现一个带有描边动画效果的复选框

    在网页或者是APP的开发中,动画运用得当可以起到锦上添花的作用.正确使用动画,不但可以有助于用户理解交互的作用,还可以大大提高网页应用的魅力和使用体验.并且在现在的网页开发中,动画已经成为了一个设计的 ...

  3. es6之数据结构 set,WeakSet,mapWeakMap

    { let list = new Set(); list.add(1); list.add(2); list.add(1); console.log(list); //Set(2) {1, 2} le ...

  4. Dota2团战实力蔑视人类,解剖5只“AI英雄”

    去年,OpenAI 在 DOTA 的 1v1 比赛中战胜了职业玩家 Dendi,而在距离进阶版 OpenAI Five 系统战胜人类业余玩家不过一个月的时间,今天凌晨,它又以 2:1 的战绩再次完成对 ...

  5. C++(存储类)经典!!

    C++变量的存储类别(动态存储.静态存储.自动变量.寄存器变量.外部变量)动态存储方式与静态存储方式 我们已经了解了变量的作用域.作用域是从空间的角度来分析的,分为全局变量和局部变量. 变量还有另一种 ...

  6. 继续C#开发or转做产品

    本人今年大四,C#开发,在一家公司实习了一年后,面临一个选择,是继续C#开发还是转做产品?我C#开发能力目前还一般,但很有兴趣.也喜欢设计与创意,做过产品专员.求大婶们指导!

  7. (转)Hibernate框架基础——映射普通属性

    http://blog.csdn.net/yerenyuan_pku/article/details/52739871 持久化对象与OID 对持久化对象的要求 提供一个无参的构造器.使Hibernat ...

  8. CAD使用SetxDataString写数据(网页版)

    主要用到函数说明: MxDrawEntity::SetxDataString 写一个字符串扩展数据,详细说明如下: 参数 说明 [in] BSTR val 字符串值 szAppName 扩展数据名称 ...

  9. 16位/32位/64位CPU的位究竟是说啥

    平时,我们谈论CPU,都会说某程序是32位编译,可以跑在32位机或64位机,或则是在下载某些开源包时,也分32位CPU版本或64CPU位版本,又或者在看计算机组成相关书籍时,特别时谈到X86 CPU时 ...

  10. springmvc学习及源码地址

    http://jinnianshilongnian.iteye.com/blog/1634096