我错过了一些简单的事情。
我正在生成一些我绑定到GridView的二进制文件。
FileDownloadGrid.DataSource = downloadList;
FileDownloadGrid.DataBind();
网格的有趣部分编码如下:
<asp:TemplateField>
<ItemTemplate>
<asp:LinkButton ID="DownloadFile" runat="server" Text="Download" CommandName="DownloadFile1"
CommandArgument='<%#Eval("FullName") +"|" + Eval("Name") %>'>
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
我正在尝试使用IFRAME Ajax方法下载文件。
function InitializeRequest(sender, args) {
// Check to be sure this async postback is actually
// requesting the file download.
if (sender._postBackSettings.sourceElement.id == "FileDownloadGrid") {
// Create an IFRAME.
var iframe = document.createElement("iframe");
// Get the desired region from the dropdown.
var fName = $get("CommandArgument").value;
// Point the IFRAME to GenerateFile, with the
// desired region as a querystring argument.
iframe.src = "Default2.aspx?fName=" + fName;
// This makes the IFRAME invisible to the user.
iframe.style.display = "none";
// Add the IFRAME to the page. This will trigger
// a request to GenerateFile now.
document.body.appendChild(iframe);
}
}
从我在网上找到的内容来看,我无法获取CommandArgument客户端,我似乎无法弄清楚如何在脚本中获取'FullName'。
有人可以指出我正确的方向吗?我正在把头发拉出来做一些非常简单的事情。
感谢
基因
答案 0 :(得分:0)
在咬牙切齿之后,我决定直接调用JavaScript函数。
这是javascript:
function DownloadFile(filename) {
// Check to be sure this async postback is actually
// Create an IFRAME.
var iframe = document.createElement("iframe");
// Point the IFRAME to GenerateFile, with the
// desired region as a querystring argument.
iframe.src = "Default2.aspx?fileName=" + filename;
// This makes the IFRAME invisible to the user.
iframe.style.display = "none";
// Add the IFRAME to the page. This will trigger
// a request to GenerateFile now.
document.body.appendChild(iframe);
}
这是适用于我的代码:
<asp:LinkButton ID="DownloadFile" runat="server" Text="Download"
onClientClick='<%# string.Format("DownloadFile(\"{0}\");", Eval("FullName")) %>'></asp:LinkButton>
一个关键位似乎是将'FullName'路径从\转换为/。
string serverPath = toFileName.Replace("\\", "/");
然后在default2.aspx.cs中我这样做:
protected void Page_Load(object sender, EventArgs e)
{
string workPath = Request.QueryString["fileName"];
string fullPath = workPath.Replace('/', '\\');
string fileName = Path.GetFileName(fullPath);
string attachmentHeader = String.Format("attachment; filename={0}", fileName);
Response.AppendHeader("content-disposition", attachmentHeader);
Response.ContentType = "application/octet-stream";
Response.WriteFile(fullPath);
Response.End();
}
我确信有更好的方法来做所有这些,但这就是我通过黑客攻击而想出来的,我希望它可以帮助其他人。