由来:对于下载word文档和预览文档,需要根据选中行获取这条记录的文档地址和文档名称,然后点击下载或预览,将需要的参数传到后台调用相应的方法。首先想到的就是通过js获取本行的值,作为参数传递到后台调用下载和预览的方法。
以下是使用的两种方式调用后台的方法!
方法一:
js代码:
<script type="text/javascript">
//下载
function btnDownLoad() {
var row = $('#dg').datagrid('getSelected');
if (row) {
//选中行的id,文档名称,文档地址
var id = row.id;
var name = row.wordName;
var wordaddress = row.wordAddress;
//createXMLHTTP(); //创建XMLHttpRequest对象 + "&wordaddress=" + wordaddress
//var url = "QueryWord.aspx?name=" + name + "&wordaddress=" + wordaddress;
//js跳转页
//window.location.href = "QueryWord.aspx?name=" + name;
//调用后台click方法
//document.getElementById("btnLoad").click();
var myurl = "UnitsQueryWord.aspx" + "?" + "name=" + name + "&wordaddress=" + wordaddress;
document.getElementById("btnLoad").click();
//var myurl = wordaddress;
当跳转为文档的地址时,即实现下载
window.location.assign(myurl);
}
else {
alert('请选中一条记录进行修改');
return;
}
}
</script>
后台方法:
protected void btnLoad_Click(object sender, EventArgs e)
{
//string tableName = Request.QueryString["tableName"].ToString();
string name = Request.QueryString["name"].ToString();
string wordaddress = Request.QueryString["wordaddress"].ToString();
//DownloadFile(Server.MapPath("UpLoadWord/2013年度考核办法(2014-2-2修改稿)2.doc"), "2013年度考核办法(2014-2-2修改稿)2.doc");
//DownloadFile(name,wordaddress);
}
这种方法未能实现,原因是这两条语句
(
var myurl = "UnitsQueryWord.aspx" +"?" + "name=" + name + "&wordaddress=" +wordaddress;
document.getElementById("btnLoad").click();
)
单独使用均没有问题但一起使用后台就获取不到前台传过去的值。如上图,如果将click事件去掉,点击下载时,参数已经在浏览器中显示。但是当加上click语句,相当于刷新一次界面,而我们知道窗体首次加载时肯定是无参数值的,所以后台会一直获取不到值,提示:未将对象引用到对象实例!
方法二:
js代码:
<script type="text/javascript">
//预览
function btnPreView() {
var row = $('#dg').datagrid('getSelected');
if (row) {
//文档地址
var wordaddress = row.wordAddress;
var s = '<%=WordToHtml2("' + wordaddress + '") %>';
}
}
</script>
后台代码:
public string WordToHtml2(string wordFileName)
{
if (wordFileName == null || wordFileName == "")
{
string HtmlPath = WordToHtml(Server.MapPath(wordFileName));
string rePath = HtmlPath.Substring(HtmlPath.IndexOf("UpLoadWord\\") + 11, HtmlPath.Length - HtmlPath.IndexOf("UpLoadWord\\") - 11);
Response.Redirect("UpLoadWord/" + rePath);
return "1";
}
return "2";
}
这种方法一般在有返回值时使用,如上的代码最终js代码中的变量s的值为2,也就是直接给我们结果(如上第一张图结果为“2”)。而且这个方法并不是触发什么事件时执行,而是窗体一旦加载就执行这个方法( var s ='<%=WordToHtml2("' + wordaddress + '") %>';
)因为窗体加载时wordAddress并没有值,固导致直接判断wordFileName是否等于wordAddress。
而且当我们加载完后点击“预览html”按钮时s的值已经为2。固这种方法仍不能满足要求!
总结:
js调用后台的方法有多种,上面只是针对其中两种进行解释说明。当我们在网上搜的时候会看到多种方法,但是我们并不知道它是怎么实现的,只有自己真正使用,调试时才会真正了解它,如果我们对方法的实现不是很了解,那么就可能出现在这种情况下可以实现,在另一种情况下就不能实现而自己还不知道为什么。所以我们在学习时不能只想着功能的实现,而要真正理解它,那么这个知识才是自己的!