上一篇学习了Silverlight Navigation导航框架URI映射机制,其中讨论到Silverlight Navigation导航框架传递参数的问题。说起导航框架页面间传递参数,是最常用开发技巧之一。本篇将详细讲解Silverlight Navigation导航传参方法。
传统Web应用中,由于普通Web页面属于无状态类型页面,所以各页面间传递参数经常使用Cookies,Session或者ViewState技术传递数据。另外,也会经常使用QueryString参数的方式,附加要传递的参数到当前URI链接,共享参数在服务器端和客户端之间。相比而言,Silverlight作为富客户端技术,其应用页面属于有状态类型页面,简单的理解,在Silverlight客户端定义的变量其内容都会被保存在客户端内存中,当前页面状态也将被保存。换句话说,Silverlight页面间传递参数可以定义全局应用级变量进行参数传递,但是这种方式会增加应用内存开支,降低应用运行效率,所以不推荐使用。而Silverlight应用另外一种传递参数的方法与传统Web应用传递参数方法类似,使用
“QueryString参数”的方式实现页面间参数传递。
“QueryString参数”方式传递参数基础格式
“QueryString参数”方式传递参数,在传统Web应用传参中经常用到,Silverlight仍旧使用传统格式进行URI参数传递操作,其格式如下:
/Views/Page.xaml?Parameter=Value
以上链接中,Page.xaml是一个Silverlight客户端应用页面,而需要传递的参数名称为“Parameter”,其参数值为“Value”。通过使用"?"连接页面名称和附带参数,目的页面通过指定API可以获取到附带的参数名称和参数值。
页面间,多参数传递格式如下:
/Views/Page.xaml?Parameter1=Value1&Parameter2=Value2
以上链接中使用"&"符号实现在URI中附加多参数,以达到多参数传递目的。
由上面可以看出,“QueryString参数”方式传递参数主要是通过URI,传递方法则与Silverlight导航框架URI地址映射有着密切的联系。
“QueryString参数”方式传递参数方法
在上一篇URI映射机制中,我们曾经介绍过通过在App.xaml资源文件中设置MapperUri,从Home页面传递单一参数到About页面,其映射规则是:
<uriMapper:UriMapping Uri="/About/{parameter}"
MappedUri="/Views/About.xaml?parameter={parameter}"/>
在源页面,通过NavigationService.Navigate方法对页面进行导航切换,其中附带需要传递的参数,
private
void btSend_Click(object sender, RoutedEventArgs e)
{
this.NavigationService.Navigate(new Uri(String.Format("/About/"
+ txtQueryString.Text.Trim()), UriKind.Relative));
}
在Navigation导航框架运行时,在浏览器中URI地址格式为:
http://localhost:49750/SilverlightNavigationDemoTestPage.aspx#/About/SilverlightChina
通过URI地址映射解析,其实际地址将指向到"/Views/About.xaml?parameter=SilverlightChina",
根据以上介绍,如果需要传递多参数到目的页面,则需要添加新的地址映射规则,其中附带多个参数即可。例如添加规则:
<uriMapper:UriMapping
Uri="/About/{name}&{url}" MappedUri="/Views/About.xaml?name={name}&url={url}"/>
使用NavigationService.Navigate方法对页面进行导航切换,其中附带需要传递的多个参数:
private
void btSendMultiple_Click(object sender, RoutedEventArgs e)
{
this.NavigationService.Navigate(new Uri(String.Format("/About/"
+ txtNameString.Text.Trim()
+ "&"
+ txtURLString.Text.Trim()), UriKind.Relative));
}
在映射规则中,使用{name}和{url} 作为URI通用符,两者使用"&"是“&”符号的HTML表示方法。
在Navigation导航框架运行时,在浏览器中URI地址格式为:
http://localhost:49750/SilverlightNavigationDemoTestPage.aspx#/About/%E9%93%B6%E5%85%89%E4%B8%AD%E5%9B%BD%E7%BD%91&SilverlightChina.Net
通过URI地址映射解析,其实际地址将指向到
"/Views/About.xaml?name=%E9%93%B6%E5%85%89%E4%B8%AD%E5%9B%BD%E7%BD%91&url=SilverlightChina.Net"
读取“QueryString参数”方式传递参数值
Silverlight Navigation导航框架完成参数传递后,其目的页面,需要使用NavigationContext对象中的QueryString属性读取当前URI中包含的传递参数名称,以获取其参数值。其基本格式如下:
object parameter = this.NavigationContext.QueryString["parameter"];
以上面两个例程而言,其读取参数格式如下:
protected
override void OnNavigatedTo(NavigationEventArgs e)
{
if (this.NavigationContext.QueryString.ContainsKey("parameter"))
{
tbReceiveParameter.Text =
"接收到的传递参数值:
" +
this.NavigationContext.QueryString["parameter"];
}
else
{
tbReceiveParameter.Text =
"接收参数1:
" +
this.NavigationContext.QueryString["name"]
+ " 接收参数2:
" +
this.NavigationContext.QueryString["url"];
}
}
在使用NavigationContext读取参数时,有以下两点需要注意:
- 读取参数前需要检测参数名称是否存在,如果NavigationContext.QueryString中不存在需要获取的参数名称,则应用会出现异常;而参数值允许为空,如果参数值空,则返回Null到页面。常用检测代码如下:NavigationContext.QueryString.ContainsKey(paramName)
- 参数赋值前需要进行参数类型转换,因为参数传递是以字符串形式传递,而页面赋值时则需要根据需求进行值类型转换,否则应用会出现异常;常用类型转换代码如下:int.TryParse(NavigationContext.QueryString[paramName], out paramValue)
最后,从MSDN转一个URI地址映射解析匹配对照表,其中包括URI附带参数实例:
今天讲到这里,如果您有问题,欢迎留言讨论。
源代码下载
分享到:
相关推荐
uni-app 自定义底部导航栏uni-app-bottom-navigation-master.zip
本篇文章主要介绍了React Native react-navigation 导航使用详解,详解的介绍了react-navigation导航的使用,具有一定的参考价值,有兴趣的可以了解一下
react-native流行的导航器控件,React-navigation导航器的使用
DotnetBar 8.1.0.6教程-NavigationPane 从官方网站下载的教程,是用VB演示的如何使用DotnetBar的,是英文版的。 在C#中用起来一样,但愿对大家有用。
ROS 与 navigation 教程-基本导航调试指南 ROS 与 navigation 教程-安装和配置导航包 ROS 与 navigation 教程-结合 RVIZ 与导航包 ROS 与 navigation 教程-发布里程计消息 ROS 与 navigation 教程-...
Laravel开发-laravel-navigation Laravel 5的动态导航
mapbox-navigation-android, 面向Android的Mapbox导航 SDK 当用户希望从一个位置到另一个位置时,不要将它们从应用程序推送到通用映射应用程序中。 相反,让他们与你的应用程序在turn-by-turn导航中的时间保持 100% ...
navigation版本5 yarn add react-navigation-props-mapper 或者npm i react-navigation-props-mapper 动机如果您在2018年左右开始RN开发,您会记得那时的导航是多么痛苦。 列举一些库,其中有react-native-router-...
Android导航 - Navigation
jquery-powered-html5-navigation-menu.zip
Cesium-navigation是一个cesium的插件,提供指南针、导航仪和距离刻度用户图形界面。
uni-app 侧边导航分类,适合商品分类页面uni-app-left-navigation-master.zip
Laravel开发-navigation Soda框架:导航
Android-duo-navigation-drawer.zip,一个灵活,易于使用,独特的抽屉库为您的Android项目。,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性...
React Native Navigation React Native Navigation provides 100% native platform navigation on both iOS and Android for React Native apps. The JavaScript API is simple and cross-platform - just install ...
E-Navigation框架下船舶智能航线服务系统设计研究.rar
E-Navigation框架下船舶智能航线服务系统设计研究.pdf
导航 需要 2.x和 2.x vue导航的默认行为类似于本地移动应用(A,B,C是页面): A转发到B,然后转发到C; C回到B,B将从缓存中恢复; B再次转发给C,C将重建,而不是从缓存中恢复; C前进到A,A将建立,现在...
react-navigation-stack 2 react-navigation-stack 1 (支持来自单个代码库的react-navigation API 4.x和5.x) React导航5 React导航4和3 react-navigation-stack 2 不太可能得到支持: 指数 安装 在您的...