3

当我在后面的代码中设置带有 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"

在设计视图中它有效。

如何解决这个问题?

4

3 回答 3

4

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

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

更新。出于好奇,经过评论中的讨论,这里是Image控件源代码的相关部分,这证明了 url 形式的~/Images/...将被正确处理:

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);
    }
}
    //...
于 2013-08-05T09:18:01.497 回答
3

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

image.ImageUrl= ResolveClientURL("~/Images/image.png");
于 2013-08-05T09:21:36.587 回答
0

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

于 2013-08-05T09:18:22.700 回答