由来:对于下载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调用后台的方法有多种,上面只是针对其中两种进行解释说明。当我们在网上搜的时候会看到多种方法,但是我们并不知道它是怎么实现的,只有自己真正使用,调试时才会真正了解它,如果我们对方法的实现不是很了解,那么就可能出现在这种情况下可以实现,在另一种情况下就不能实现而自己还不知道为什么。所以我们在学习时不能只想着功能的实现,而要真正理解它,那么这个知识才是自己的!