【问题标题】:Open PDF in default viewer from DataGrid从 DataGrid 在默认查看器中打开 PDF
【发布时间】:2013-03-19 17:09:36
【问题描述】:

我有一个网格,显示文件夹中所有 pdf 文件的名称和链接。该链接将在浏览器中打开文件。

这并不理想,因为浏览器会缓存文件,所以如果文档被移动或更改,旧的缓存版本仍然可以访问。

是否可以让链接在默认安装的 pdf 查看器中打开文件并完全避免缓存?

这是我的网格代码:

<form runat="server">
Search for a file: <asp:TextBox ID="txtFilter" runat="server"></asp:TextBox>
    <asp:Button ID="btnShow"
        runat="server" Text="Display" onclick="btnShow_Click" />
</form>


<asp:DataGrid runat="server" id="FileList" Font-Name="Verdana" CellPadding="5"
AutoGenerateColumns="False" AlternatingItemStyle-BackColor="#eeeeee"
HeaderStyle-BackColor="Navy" HeaderStyle-ForeColor="White"
HeaderStyle-Font-Size="15pt" HeaderStyle-Font-Bold="True">
<Columns>
<asp:HyperLinkColumn DataNavigateUrlField="Name" DataTextField="Name" 
       HeaderText="File Name" target="_blank"/>
<asp:BoundColumn DataField="LastWriteTime" HeaderText="Last Write Time"
    ItemStyle-HorizontalAlign="Center" DataFormatString="{0:d}" />
</Columns>
</asp:DataGrid>  

CS:

protected void btnShow_Click(object sender, EventArgs e)
    {
     ShowData();
    }

    public void ShowData()
    {
        DirectoryInfo dirInfo = new DirectoryInfo(Server.MapPath(""));

        FileInfo[] info = dirInfo.GetFiles("*.pdf");            //Get FileInfo and Save it a FileInfo[] Array

        List<Getfiles> _items = new List<Getfiles>();          // Define a List with Two coloums

        foreach (FileInfo file in info) //Loop the FileInfo[] Array
           _items.Add(new Getfiles { Name = file.Name, LastWriteTime = file.LastWriteTime.ToString("MM/dd/yyyy") });  // Save the Name and LastwriteTime to List


        var tlistFiltered1 = _items.Where(item => item.Name.Contains(txtFilter.Text)); // Find the file that Contains Specific word in its File Name

        FileList.DataSource = tlistFiltered1; //Assign the DataSource to DataGrid
        FileList.DataBind();

    }

    public class Getfiles
    {
        public string Name { get; set; }
        public string LastWriteTime { get; set; }
    }

【问题讨论】:

  • 我的默认 pdf 查看器是谷歌浏览器......所以对我来说它可能无法正常工作。也许您可以以某种方式禁用网络服务器级别的 pdf 缓存?
  • @nvoigt 可以吗?即使您进行了服务器级别更改,我的浏览器是否仍会缓存?我也使用 Chrome。

标签: c# asp.net pdf


【解决方案1】:

你最好向用户提示一个对话框并要求他下载文件,然后它将避免在浏览器中缓存......

试试下面...

HTML:

Change the DataGrid HyperLinkColumn 如下:

<asp:HyperLinkColumn DataNavigateUrlField="Name" DataTextField="Name" 
       HeaderText="File Name" target="_blank"  DataNavigateUrlFormatString="Download.aspx?FileName={0}" />

然后Add a New .aspx page到您的网站并将其命名为Download.aspx...

并在Download.aspxPage load event 上编写以下代码..

C#:

       protected void Page_Load(object sender, EventArgs e)
        {
            string FName = Server.MapPath(@"Files\" + Request.QueryString["FileName"].ToString());
            Response.Clear();
            Response.ContentType = "application/pdf";
            Response.AppendHeader("Content-Disposition", "attachment; filename=" + FName);
            Response.TransmitFile(FName);
            Response.End(); 
        }

【讨论】:

  • 这确实可以避免缓存,但它会在每个下载它的用户的机器上创建一个文档副本,这并不理想。它仍然是一种选择。我是否需要寻找一个开源的 pdf 网络查看器并找到一种将文档传递给它的方法?
  • 感谢您的建议。
  • 如果pdf在iFrame中,你认为它会被缓存吗?
猜你喜欢
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2021-06-09
相关资源
最近更新 更多