【问题标题】:Can't render the image when setting its url in code behind在后面的代码中设置其 url 时无法渲染图像
【发布时间】:2013-08-05 09:12:47
【问题描述】:

当我在后面的代码中设置带有 url 的图像时不起作用,我不知道为什么?

 if (File.Exists(Server.MapPath("~/Images/EmpQr/") + int.Parse(Session["userID"].ToString()) + ".PNG")) //It passes this condition 
            {
                tr_res.Visible = true;
                img_res.ImageUrl = Server.MapPath("~/Images/EmpQr/" + int.Parse(Session["userID"].ToString()) + ".PNG"); //Here 's the problem ,no image 

            }
            else
            {
                tr_res.Visible = false;
            }

<asp:Image ID="img_res" runat="server" AlternateText="result"  />

当我像这样设置图片网址时

ImageUrl ="~/Images/EmpQr/1345.PNG"

在设计视图中它可以工作。

如何解决这个问题?

【问题讨论】:

    标签: c# asp.net image file server.mappath


    【解决方案1】:

    Server.MapPath 为您提供文件的本地路径。虽然您真正想要的是相对于应用程序根路径(在服务器上!)。对于这个你已经拥有的,~/Images/EmpQr/ 很好,所以只需将文件名附加到它:

    img_res.ImageUrl = string.Format("{0}{1}.PNG", "~/Images/EmpQr/", int.Parse(Session["userID"].ToString()));
    

    更新。 出于好奇,经过cmets讨论,下面是Image控制源码的相关部分,证明~/Images/...形式的url会被正确处理:

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
    base.AddAttributesToRender(writer);
    string text = this.ImageUrl;
    if (!this.UrlResolved)
    {
        text = base.ResolveClientUrl(text);
    }
    if (this.RenderingCompatibility >= VersionUtil.Framework45)
    {
        if (!string.IsNullOrEmpty(text) || base.DesignMode)
        {
            writer.AddAttribute(HtmlTextWriterAttribute.Src, text);
        }
    }
    else
    {
        if (text.Length > 0 || !base.EnableLegacyRendering)
        {
            writer.AddAttribute(HtmlTextWriterAttribute.Src, text);
        }
    }
        //...
    

    【讨论】:

    • @Icarus,实际上,它会的。首先请注意,OP 提到在 markpu 中明确指定的完全相同的 URL 可以正常工作。其次请记住,无论您设置为控件的值(我们在这里讨论的是asp:Image,而不仅仅是img 标签),ASP.NET 都会在之后进行处理,并适当地处理 url。 IN ASP.NET ~/ 是引用应用根文件夹的常用方法。
    • 我认为你是对的。我后来想了想……这是一个服务器控件,可能会在后台调用 ResolveClientUrl。
    • @Icarus,它确实在内部调用了这个方法。如果你有 ILSpy 或类似的,你可以检查Image.AddAttributesToRender 方法
    • 这就是我的想法...我正在从我的手机中打字,所以我无法确认,但会相信你的话;)你能编辑你的答案以便我投票吗?除非您对其进行编辑,否则系统不会让我 :-(
    【解决方案2】:

    您自己发现了问题,因为正如您所说,使用“~/Images/.../”设置图像 URL 有效,而使用 Server.MapPath 则无效。 Server.MapPath 不起作用的原因是因为此函数返回图像的物理路径(如 c:\site...),而您需要的是虚拟路径。您可以改为使用 Page.ResolveClientUrl 从后面的代码设置图像路径。像这样的:

    image.ImageUrl= ResolveClientURL("~/Images/image.png");
    

    【讨论】:

      【解决方案3】:

      Server.MapPath("~/Images/EmpQr/" + int.Parse(Session["userID"].ToString()) + ".PNG") 而不是这个使用这个 Server.MapPath("~/Images/EmpQr/") + int.Parse(Session["userID"].ToString()) + ".PNG"

      【讨论】:

      • 左大括号和右大括号有变化。先检查再评论。
      • 我没有说是因为括号是错误的,我说这是错误的因为你设置图像 URL 的方式。您不能使用 Server.MapPath。你的答案还是错了,对不起。
      猜你喜欢
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多