【问题标题】:Open pdf from hyperlink in gridview从gridview中的超链接打开pdf
【发布时间】:2012-06-14 16:25:39
【问题描述】:

想要在用户点击gridview列中显示的超链接时打开pdf文件。文件名取自gridview的第一列,其中存储了文件标题。

将鼠标悬停在gridview中的超链接上会显示文件链接,但单击时不会打开pdf文件,

protected void Gridview1_RowDataBound(object sender, GridViewRowEventArgs e)
{

 if (e.Row.RowType == DataControlRowType.DataRow)
        {
            HyperLink hlink = (HyperLink)e.Row.FindControl("HL");
            string url = "~/Docs/" + e.Row.Cells[1].Text +".pdf";
            hlink.NavigateUrl = url;
            hlink.Text = "Read";
        } 
 }

点击超链接时出现以下错误,因为它无法打开pdf文件。

找不到资源。 说明:HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用

在网格视图中单击超链接时会调用哪个事件,可能会在此处打开 pdf 应用程序。请建议。提前致谢。

【问题讨论】:

  • 您确定链接到的文件位于该位置吗?尝试将Server.MapPath(url); 的调试输出并确保物理文件位置匹配
  • 我确定文件在那里....我什至放了文件的完整路径...仍然是同样的错误

标签: c# asp.net


【解决方案1】:

错误提示您的文件不存在。您应该做的是放弃您所做的连接,而是在数据源中包含文件的全名(包括扩展名)并使用它(甚至是整个路径)。您想要这样做的原因是因为您可能出于审美目的严格修改/格式化/编码了单元格文本。您甚至可以添加一些嵌入式 html 来设置样式。

我想它会是这样的:

protected void Gridview1_RowDataBound(object sender, GridViewRowEventArgs e)
{

 if (e.Row.RowType == DataControlRowType.DataRow)
     {
            DataRow row = ((System.Data.DataRowView)e.Row.DataItem).Row;
            HyperLink hlink = e.Row.FindControl("HL") as HyperLink;
            if (hlink!=null)
            {
                string url = string.Format("~/Docs/{0}",row["FileName"]);
                hlink.NavigateUrl = url;
                hlink.Text = "Read";
            }
     } 
}

【讨论】:

  • 关于存储整个文件名的好建议。
  • 处理您的建议,我分三个步骤工作,首先我按照您的建议实施。其次,我在网址中添加了“.pdf”。第三,我对整个文件路径进行了硬编码。同样的错误,“找不到资源”。我在同一位置有文件。我觉得必须以某种方式调用 pdf 应用程序才能打开 pdf 文件,因为它显示“您正在寻找的资源(或其依赖项之一)可能已被删除、更改名称或暂时不可用”...... .depenedecies....
  • 有趣。在这种情况下@Sumit 我会做的是查看页面的来源然后观察链接。在查看链接时,看看您是否注意到任何异常。您的路径中某处有问题或该文件在服务器上不存在。将路径复制到剪贴板并将其粘贴到浏览器中,看看会发生什么。它应该做完全相同的事情,只有这样做才能让你看到以前没有看到的东西。
  • @jeremy 在浏览器中调用路径会完美打开 pdf 文件,正如您所期望的那样。但是在代码中,对完整路径进行硬编码不会打开文件。同样的错误。当我硬编码完整路径时,超链接实际上停止工作。
  • 令人着迷!你介意发布路径吗?我想知道是否有任何编码问题。我认为作为另一个故障排除练习,您可以让您的链接引用不同的文件类型(如 txt),并使其成为一个不带空格的简单文件名,以查看是否有任何更改。
【解决方案2】:

您是否尝试在此页面的浏览器中检查“查看源代码”以检查正在输出的链接的实际路径并验证它是否正确?
您是否已通过调试器确保 FindControl("HL"); 确实找到了您正在寻找的控件?由于控件位于 GridView 中,asp.net 可能已修改其id。您可以尝试使用

获取HL 控件
HyperLink hlink = e.Row.Cells[HL_cell_index].Controls[HL_control_index] as HyperLink;

如果您在那里遇到问题。这两件事中的一件一定是你的问题。

作为建议,与@Jeremy 一致,您还应该将文件的完整路径存储在数据源(无论是数据库还是您使用的任何东西)中以绑定到此超链接列,这样您就不会必须做这个额外的事件绑定并遇到这样的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2011-11-25
    • 2012-09-25
    • 1970-01-01
    相关资源
    最近更新 更多