Вы можете создать файл пользовательского обработчика (.ashx) и соответственно установить информацию заголовка ответа.Это должно обеспечить перенаправление на другую страницу.
1) Зарегистрировать универсальный HttpHandler для обработки загрузок (Добавить> Новый элемент> Универсальный обработчик):
Downloads.ashx.cs:
using System;
using System.Web;
namespace FileDownloads
{
public class Downloads : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
var file = context.Request.QueryString["f"];
// Assuming all downloadable files are in a folder called "downloads"
// located at the root of your website/application...
var path = context.Server.MapPath(
string.Format("~/downloads/{0}", file)
);
var response = context.Response;
response.ClearContent();
response.Clear();
response.AddHeader("Content-Disposition",
string.Format("attachment; filename={0};", file)
);
response.WriteFile(path);
response.Flush();
response.End();
}
public bool IsReusable
{
get { return false; }
}
}
}
2) Подключите ваш GridView так:
defalut.aspx:
<asp:gridview id="downloadsGridView" runat="server" autogeneratecolumns="false">
<columns>
<asp:hyperlinkfield headertext="File Name"
datatextfield="Name"
datanavigateurlfields="Name"
datanavigateurlformatstring="~/Downloads.ashx?f={0}" />
</columns>
</asp:gridview>
default.aspx.cs:
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
namespace FileDownloads
{
public partial class _default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack) return;
var directory = Server.MapPath("~/downloads/");
var filePaths = Directory.GetFiles(directory);
downloadsGridView.DataSource = filePaths.Select(x => new DLFile
{
Name = x.Split('\\').Last()
});
downloadsGridView.DataBind();
}
public class DLFile
{
public string Name { get; set; }
}
}
}
Очевидно, вам нужно настроить приведенный выше пример в соответствии с вашими конкретными требованиями.Загрузка файлов с помощью вышеуказанного метода является прекрасным примером того, когда вам следует использовать общий HttpHandler.