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,表示登陆了.这样当我们在页面访问需要登录访问的页面的时候就会被转到

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

好了,今天就到此吧.

posted @ 2011-09-03 23:36  wangyafei_it  阅读(331)  评论(0编辑  收藏  举报