zoukankan      html  css  js  c++  java
  • Silverlight自定义导航验证即自定义ContentLoader

    可能这个标题说的有点奇怪,其实这个功能类似于我们在ASP.NET中的,我们通常会把一些需要登录用户才能访问的页面放到单独文件夹,而一些不用登录页面

    直接放到其他的路径,同理我们今天实现的就是这样一个功能,当用户没有登录的时候而导航了需要登录才能访问的页面,则跳转到页面去.

    废话不多说,开始正题:

    实现这个功能需要以下步骤:

    1.自定义INavigationContentLoader接口的实现类,这一步是完成验证的核心地方.对于INavigationContentLoader的解释:

    定义对应于一个 URI 的内容的加载方式。实现此接口以为 Silverlight 导航系统提供自定义的内容加载.

    看下边的实现类:

    可以看到我们类中有4个方法,其实这4个方法都是INavigationContentLoader接口的,我们只是进行了实现.

    在类中定义了一个PageResourceContentLoader 类型(实现自INavigationContentLoader接口)的对象,作用就是进行加载给定URL的页,很巧他也有对应的几个方法,

    几个方法解释如下:BeginLoad开始加载,CanLoad判断是否可以加载,CancelLoad取消加载,EndLoad加载完毕,在这里我们实现BeginLogin方法.

    在类中定义了两个属性,一个LoginPage代表登录页面的设置,一个SecuredFolder代表需要登录访问的文件所在的文件夹名称.

    同时我们在App中定义了一个bool类型的变量UserIsAuthenticated用来表示用户是否登陆了.

    在BeginLoad方法中判断当前的url的所属文件夹是否包含了要限制的文件的文件夹名称,同时访问的页面也不是登录页面,如果判断成功,则使用

    targetUri = new Uri(LoginPage, UriKind.Relative);修改当前访问的页面为登录页面,这个很好理解的.

       public class CustomContentLoader : INavigationContentLoader
    {
            //加载应用程序包(.xap 文件)中对应于给定 URI 的页。
    private PageResourceContentLoader loader = new PageResourceContentLoader();
            //指定登录页面
            public string LoginPage { get; set; }
           //指定需要登录用户才能访问的文件的文件夹
            public string SecuredFolder { get; set; }
            public IAsyncResult BeginLoad(Uri targetUri, Uri currentUri, AsyncCallback userCallback, object asyncState)
            {
                //如果是匿名用户
                if (!App.UserIsAuthenticated )
                {
                    //如果访问的页面是需要登录用户才能访问的页面
                    if ((System.IO.Path.GetDirectoryName(targetUri.ToString()).Contains( SecuredFolder)) && (targetUri.ToString()!=LoginPage))
                    {
                        targetUri = new Uri(LoginPage, UriKind.Relative);
                    }
                }
                return loader.BeginLoad(targetUri,currentUri,userCallback,asyncState);
            }
            public bool CanLoad(Uri targetUri, Uri currentUri)
            {
                return loader.CanLoad(targetUri, currentUri);
            }
            public void CancelLoad(IAsyncResult asyncResult)
            {
                loader.CancelLoad(asyncResult);
            }
            public LoadResult EndLoad(IAsyncResult asyncResult)
            {
                return loader.EndLoad(asyncResult);
            }
        }
    }

    2.好了,我们的ContentLoader搞定了,怎么使用呢,看下边代码,local是我们引用ContentLoader所在namespace的引用,实际上我们就是修改了Frame的ContengLoader属性

    为我们自定义的ContenLoader,同时设置了LoginPage和SecuredFolder属性:

      <sdk:Frame Name="MainFrame" Source="/Navigation/Pages/PageInit.xaml"   Grid.Row="0">
    <sdk:Frame.ContentLoader>
    <local:AuthenticatingContentLoader LoginPage="/LoginPage.xaml" SecuredFolder="SecurePages"/>
    </sdk:Frame.ContentLoader>
    </sdk:Frame>

    添加测试页面,添加按钮,进行登录,在登录事件中修改App中的UserIsAuthenticated为ture,表示登陆了.这样当我们在页面访问需要登录访问的页面的时候就会被转到

    设置的登录页面,如果登陆了则直接显示.

    好了,今天就到此吧.

  • 相关阅读:
    200斤的甄子丹还是这么灵活能打欢乐,拯救无聊就靠他了
    redis 发布与订阅
    洛谷P2294 [HNOI2005]狡猾的商人
    洛谷P2294 [HNOI2005]狡猾的商人
    崛起于Springboot2.X之开发拦截器(21)
    pfSense®2.4.4发布后,原pfSense 黄金会员的服务将免费使用!
    pfSense®2.4.4发布后,原pfSense 黄金会员的服务将免费使用!
    pfSense®2.4.4发布后,原pfSense 黄金会员的服务将免费使用!
    pfSense®2.4.4发布后,原pfSense 黄金会员的服务将免费使用!
    Openssh
  • 原文地址:https://www.cnblogs.com/ListenFly/p/2165909.html
Copyright © 2011-2022 走看看