asp.net MVC4 ActionFilterAttribute過濾器使用(主要處理當用戶不登陸的時候打開頁面跳轉到登錄頁面功能)


1、登錄頁面代碼:

@{
    ViewBag.Title = "會員登錄";
    Layout = "~/Views/Shared/_LayoutDialog.cshtml";
}

<div class="loginBox">
    <div class="loginHead" style="color: white">
        會員登錄
    </div>
    <form id="hgl-form" class="form-horizontal" action="@Url.Action("Login", "Home", new { area = string.Empty })" method="post">
        <div class="control-group">
            <label for="inputEmail">賬戶</label>
            <input type="text" name="account" id="inputEmail" class="validate[required]" />
        </div>
        <div class="control-group">
            <label for="inputPassword">密碼</label>
            <input type="password" name="password" id="inputPassword" class="validate[required]" />
        </div>
        @*<div class="control-group" style="margin-bottom: 5px;">
                    <label class="checkbox">
                        <input type="checkbox" name="rememberMe" checked>
                        記住我</label>
                </div>*@
        <div class="form-actions">
            <button type="submit" class="btn btn-block">登錄</button>
        </div>
    </form>

</div>

@section scripts{
    <script type="text/javascript">
        $(function () {
            //表單提交
            hgl.sumbit(function () {
                location.href = '@Url.Action("Index", "SiteSet", new { area = "Setting" })';//登陸成功后跳轉到的頁面
            });
        })
    </script>
}

  2、登錄controller代碼:

        //會員登錄
        [HttpGet]
        public ActionResult Login()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Login(string account, string password)
        {
            var entity = AdminService.QueryDetailForAccount(account);
            if (entity == null)
                return JRFaild("all", "此賬戶不存在");

            if (entity.Password != password.ToMD5())
                return JRFaild("all", "賬戶密碼輸入錯誤,請重新輸入");

            if (entity.Freezed == 1)
                return JRFaild("all", "此賬戶已被凍結,暫不能登錄,請聯系超級管理員");

            var result = AdminService.Login(account, password, entity);

            if (result)
            {
                Session["account"] = account;
                Session["guid"] = entity.Guid;
                Session["username"] = entity.Name;
                Session["password"] = password; return JRSuccess("登錄成功"); } return JRFaild("all", "登錄失敗,用戶名或密碼錯誤或賬戶不存在"); }

  前面是登錄模塊的代碼;下面主要介紹 ActionFilterAttribute過濾器的使用

1、在項目中新建個Filter文件夾,在文件夾里面添加該過濾器類,命名為:BasicAuthAttribute.cs;此類需要繼承ActionFilterAttribute(關於ActionFilterAttribute大家可以按F12跳轉到該類的詳細介紹進行了解和使用);我在新建的BasicAuthAttribute.cs中使用了OnActionExecuting,該類代碼如下:如下代碼在使用的時候還需要添加引用:

using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
namespace Linkin.Manager.Filter
{
    public class BasicAuthAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var account = filterContext.HttpContext.Session["account"];
            var password = filterContext.HttpContext.Session["password"];
            if (account == null || password == null) { //用戶不登陸的時候跳轉到登錄頁面 filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "Login", area = string
.Empty })); } } } }

到此為止,過濾器已經寫好了,具體的項可以直接F12到起定義進行查看,可以看出當用戶不登陸的時候會跳轉到登錄頁面

2、此時需要到配置文件里的登錄配置是怎么配置的,打開web.config,找到節點<authentication mode="Forms"></authentication>查看配置,如果自己的登錄頁面跟web.config里面的配置一樣就不需要修改了,不一致的最好修改一下

    <!--這里配置的是登錄頁面的權限配置-->
    <authentication mode="Forms">
      <forms loginUrl="~/Home/Login" timeout="2880"   />
    </authentication>

3、這樣以后在controller里面就可以直接用該過濾器了,在要使用此項過濾器的controller里面直接加入下面的紅色字體,此時這樣還需要引入該文件的引用:using Linkin.Manager.Filter;(此引用要根據自己的項目的實際情況來添加)代碼如下:

   [BasicAuthAttribute]
    public class AdminController : BasicController
    {
        [HttpGet]
        public ActionResult Index(string id, string key, int state = -1, int page = 1)
        {
            ViewBag.Id = id;
            ViewBag.Key = key;
            ViewBag.State = state;
            return View(AdminService.QueryPageList(id, key, state, page, 10));
        }
   }

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

public class AdminController : BasicController
    {
        [BasicAuthAttribute]
        [HttpGet]
        public ActionResult Index(string id, string key, int state = -1, int page = 1)
        {
            ViewBag.Id = id;
            ViewBag.Key = key;
            ViewBag.State = state;
            return View(AdminService.QueryPageList(id, key, state, page, 10));
        }
  }

4、經過以上的步驟就弄好了,此時運行網站,在不登陸的時候,直接在瀏覽器的地址欄輸入http://localhost:2341/setting/admin,此時可以看到頁面跳轉到了登錄頁面


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM