华人澳洲中文论坛

热图推荐

    「WebView2理论」开发桌面开发框架之阻拦器ActionFilter完成

    [复制链接]

    2022-10-26 21:39:44 183 0

    在asp.net mvc中的咱们常常用到的ActionFilterAttribute做申请阻拦,并且也十分好用,那末在咱们的框架中怎么本人完成阻拦器功用呢?
    其实完成的思绪也很简略,在上一篇文章,咱们引见利用反射技术调用Controller里的Action(办法)阻拦器就是在Action调用前,对申请做验证,知足前提才正式调用Action,不然终止顺序。阻拦器要完成一个验证办法,前往FilterResult对象,假如后果是Passed以为验证经过,则持续调用Action,不然不调用。
    上面来看详细完成代码,首先定义FilterResultType枚举和FilterResult类


    代码很简略,不需求解释吧。
    接着编写IActionFilter接口ActionFilterAttribute类




    BeforeInvoke办法承受三个参数context,controller,action,context是申请的上下文对象,controller是被申请的Controller对象,action就是详细的办法。这是一个虚办法,详细要看承继类型的完成。ActionFilterAttribute的运用指标是类和办法,所以能够对某个Action做阻拦,也能够对全部Controller(模块)做阻拦。
    好了,阻拦器的根基曾经打好了,上面咱们来做一个详细的阻拦器,来阻拦未登录用户的申请,取个名字吧RequiredLoginAttribute


    在RequiredLoginAttribute中咱们简略判别context.CurrentUser对象,不为null则表现已登录前往PassedResult,不然为未登录,前往RedirectResult重定向后果,顺序将被重定向到views/login.html页面让登录。
    上面贴User类和App类的代码




    到这里,用户阻拦器就实现了!然而阻拦器要怎么发扬作用呢?在后面的文章,咱们知道Action的调用是由Controller的InvokeAction办法履行的,所以,阻拦器要发扬作用也应该在那里。
    在修正InvokeAction以前,咱们先给Action添加之RequiredLoginAttribute。在XUI.App中新建Controllers目录,在此目录下新建一个Controller,IndexController,里边有一个Action名字为Dashboard,给他运用上RequiredLoginAttribute,代码如下


    再新建一个LoginController,不该用RequiredLoginAttribute


    由代码可见,当验证用户名和明码胜利后,咱们给AppContext.Instance.CurrentUser赋值(此处AppContext为App别号)
    再在views目录里创立两个View:dashboard.html和login.html




    好了,咱们来修正InvokeAction办法


    白色方框中,咱们分别读取Controller和Action上的ActionFilterAttribute,此时读取到的对应的实例应该是RequiredLoginAttribute类型,调用实例的BeforeInvoke办法,BeforeInvoke前往FilterResult对象,表现验证的后果。假如FilterResult的Type不是Passed,则InvokeAction间接return此FilterResult,那末后边的真正调用Action的代码就不会被履行了,所以能起到阻拦的作用。
    CustomWebView2.Native.SolveMessage办法再做下调剂


    修正Form1.cs,将初次加载页改成views/dashboard.html


    这样,顺序一运转,就会加载dashborad.html,此时会进行阻拦验证,接着会跳转到login.html做登录,登录实现后再进入dashborad.html页就正常显示了。
    演示视频

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    返回列表 本版积分规则

    :
    中级会员
    :
    论坛短信
    :
    未填写
    :
    未填写
    :
    未填写

    主题39

    帖子49

    积分224

    图文推荐