您的位置:首页 > 其它

My Silverlight系列(4)——恼人的Silverlight文件操作

2008-07-26 12:20 218 查看
近日,我所做的Silverlight项目有这么一个需求:点击一个控件,就像在HTML上点击一个超链接一样,由浏览器提示下载某一个文件,当然文件的Uri是已知,是通过这次点击触发的事件处理程序计算得到的。

为了实现这个目的,我试验了很多的方法,由于Silverlight只支持隔离存储区,而且它没有类似于超链接的控件,因此我必须求助于js和asp.net。在我转载的一篇文章里,那种手段的确让人眼前一亮,但是试验的结果却令我很不满意。在这里我模拟一下那种实现方法,并且给出结果。

Silverlight cs文件中代码如下:

private void Button_Click(object sender, RoutedEventArgs e)

div style="margin-bottom:100px">

<a id="download" href="" target="_blank" style=" margin-right:58px">Download a File</a>

<a id="open" href="" target="_blank" style=" margin-right:65px">Open a Site</a>

<input id="button" type="button" value="Download" onclick="return Button_onclick()" />

</div>

aspx中js代码如下:

<script language="javascript" type="text/javascript">

</script>

解释一下这些代码的作用:首先,在sliverlight的xaml文件中我定义了一个button,它的事件处理代码如第一段所示,然后我在aspx页面中加入了一个div并加入了三个元素用于对比。运行效果如图所示:

function silverlightbutton_onclick() function Button_onclick() {

window.open("http://files.cnblogs.com/wodehuajianrui/BubblyStyleProject.zip", "_self");

}

运行结果如下:



并没有被浏览器拦截,而是正常提示下载。由此可见,sliverlight出于安全因素的考虑,极大地限制了它的行为。同时,这是我调用js的结果,如果我调用dom,让aspx页面向我的浏览器post一个文件,也会被拦截……本来我们用sliverlight是为了提高用户体验,但是这样页面频繁的刷新,而且还总跳出提示,让人非常的不爽。。。

我想投机取巧的方法也不是没有,微软在他的MSN space中的SkyDrive中,做了一些手脚,他的是一个aspx页,但是如果是通过Server主动将文件post过来的话,一定会被浏览器拦截的,所以微软的工程师想了一个办法,他们巧妙的应用CSS,将一个链接打扮得像一个button,连on:focus伪类都用上了,然后动态的利用js为链接的href赋值,从而当用户点击那个长得像button的链接的时候,就会直接下载文件(因为这是用户自己的get请求,所以浏览器不会拦截)。所以在silverlight上我们完全也可以使用类似的办法欺骗用户。。。。

说到这,我希望微软在开发下一个版本的silverlight时,考虑将这些限制解除,这样那样的限制实在太讨厌了,silverlight既然可以通过js来做一些事,我们何不让它就在托管的.net代码中做那些事呢?衷心希望能在方便和安全中间,找到一个万全之策!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: