从数据库获取图像的功能不起作用

时间:2019-03-27 19:43:31

标签: javascript c# web

我是Java的新手。我想在项目的所有网页上添加一个图标。该图标将相应地更改为登录我页面的任何人。我现在要尝试的是,在母版页加载中(当我将其所有数据都包含在代码隐藏中,包括他选择的图标时),我引入了js函数来更改图标:

    (function icon(image) {
        var link = document.querySelector("link[rel*='icon']") || document.createElement('link');
        link.type = 'image/x-icon';
        link.rel = 'shortcut icon';
        link.hre = image;
        document.getElementsByTagName('head')[0].appendChild(link);
    })();

(从此处改编:Changing website favicon dynamically

im试图使用Page.ClientScript.RegisterStartupScript()方法调用此函数:

  (protected void Page_Load(object sender, EventArgs e)
  {
  if (!Page.IsPostBack)
     {
        //...

        UserModel usuario = (UserModel)Session["usuario"];

        //...

        Page.ClientScript.RegisterStartupScript(this.GetType(), "icone", $"icone({(Bitmap)new ImageConverter().ConvertFrom(usuario.imagem)});", true);
     }
  }

该方法根本不执行(它也不返回错误,它只是“跳转”),而且我真诚地不知道为什么。

很糟糕,也许有更好的方法可以做到,但我只是想不通。

为了记录,我没有在文件夹中包含图标/图像。我必须从数据库中获取它们。

(稍后我将为用户在数据库中没有图像时添加验证。现在假设它永远不会为空)。

2 个答案:

答案 0 :(得分:0)

一些内容需要编辑:

首先,认为您未按要求设置RegisterStartupScript的参数。第三个值应该是要运行的javascript代码。您可以将整个脚本添加为变量(如此处指示:https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.clientscriptmanager.registerstartupscript?view=netframework-4.7.2),也可以在<script>...</script>标签中将函数添加到HTML页面,然后只需从RegisterStartupScript中调用该函数(如第三个参数值)

第二,您的JavaScript函数中有一个错字:

link.hre = image;应该是link.href = image;

第三,(这部分可能需要一些工作)图像必须是实际图像的URL(字符串)(而不是二进制位图)...您可能首先必须将图像另存为Web服务器。 .jpg或.png并在其中使用其URL,否则您必须将图像转换为Base64并通过数据URL https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs

添加图像

最后,您从原始示例(您提到的)中修改了JavaScript。在这种情况下,您希望将图像URL作为参数发送给函数icon,但是icon函数已封装。因此,该功能基本上在私有范围内。如果需要从页面上的另一个函数调用该函数,请删除该函数周围的封装。希望这是有道理的。

答案 1 :(得分:0)

您可以直接将快捷方式图标链接到处理程序,而不是使用Javascript,该处理程序立即返回图像。 (以下代码未经测试,可以在其中描述基本过程!)

在您的页面中:

<link rel="shortcut icon" type="image/x-icon" href="/userimage.ashx">

userimage.ashx:

<%@ WebHandler Language="C#" Class="UserImageHandler" %>

userimage.ashx.cs:

using System;
using System.Web;

public class UserImageHandler : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "image/png"; // or image/jpg, image/bmp, ...
        var image = FetchImageFromDatabase(context.User.Identity.Name); // your logic for fetching the image from the database
            // You could also return a default image here, if the user has not selected one.
        context.Response.Write(image); // Write the binary data to the response stream.
    }

    public bool IsReusable {
        get {
            return false;
        }
    }
}