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,表示登陆了.这样当我们在页面访问需要登录访问的页面的时候就会被转到
设置的登录页面,如果登陆了则直接显示.
好了,今天就到此吧.