【问题标题】:Calling a JS function from an ASP.Net MasterPage从 ASP.Net MasterPage 调用 JS 函数
【发布时间】:2020-02-29 13:07:03
【问题描述】:

我需要从 SQL Server(公司徽标)读取图像数据并将其保存在 localStorage 中。该公司徽标显示在母版页左侧边栏中,以便在每个客户页面中都可见。

为此,我在母版页中使用了 3 个 JS 函数。

function storageCheck() {
  if (localStorage.getItem("imgData") === null) //check availability 
    document.getElementById('<%=hdfStorage.ClientID %>').value = "true"; //assign true to a hidden field
  else
    document.getElementById('<%=hdfStorage.ClientID %>').value = "false";
}

function storelogo(imgData) { //store image data
  localStorage.setItem("imgData", imgData);
}

function getImg() { //get data
  var dataImage = localStorage.getItem('imgData');
  document.getElementById('imgCompanyLogo').src = dataImage;
  alert('got')
}

在母版页后面的代码中,我调用了这些 JS 函数

protected void Page_LoadComplete(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    ScriptManager.RegisterStartupScript(this, this.GetType(), "checkfn", "storageCheck()", true);

    if (hdfStorage.Value == "true")
      ScriptManager.RegisterStartupScript(this, this.GetType(), "storelogoo", "storelogo('" + <Base64String img data from database> + "');", true);
    else if (hdfStorage.Value == "false")
      ScriptManager.RegisterStartupScript(this, this.GetType(), "getlogo", "getImg();", true);
  }
}

我已经尝试将它放在Page_Load 事件中,但没有用。我面临的问题是这些函数没有被调用,如果从页面加载事件中调用,当我使用 hdfStorage.Value == "true" 进行检查时,隐藏字段控件将不会获得值。

【问题讨论】:

  • 为什么需要保存在本地存储中?这是实现缓存的某种尝试吗?
  • @ADyson 该公司徽标位于母版页中,我可能有 100 多个客户页面。所以在加载每个客户端页面时,这个图像将从我想要避免的 sql server 中读取
  • 好的。但这种方法行不通。您误解了客户端和服务器端编程生命周期是如何发生的。 if (hdfStorage.Value == "true") 永远不会是真的。 RegisterStartupScript 只是在页面中放置一个 JavaScript 命令,当 asp.net 完成处理请求时,该命令将发送到浏览器。 JavaScript 在到达浏览器之前无法执行。所有 ASP.NET 代码将首先在服务器上执行,然后将结果(一个 HTML 页面)发送到最后的浏览器。您无法从服务器检查本地存储
  • 一种更可行的方法是使 URL 可用(例如,作为 ashx 处理程序或 webmethod 或 WCF 端点),您可以将其称为 https://example.com/GetLogo?companyID=123。您当然可以在呈现 URL 时在 ASP.NET 代码中注入正确的公司 ID。您可以将该 URL 设置为徽标图像的src。当浏览器调用该 URL 时,它将运行一些 ASP.NET 代码,这些代码将从数据库中返回正确的图像数据(使用查询字符串中提供的 ID)。
  • 并且只要您不禁止对该 URL 进行缓存,那么浏览器将自动缓存响应中返回的图像,并且不会在每次加载新页面时重复请求它。这是解决此类问题的传统方法,使用所有浏览器和网络服务器中已作为标准提供的缓存功能。

标签: javascript c# jquery asp.net scriptmanager


【解决方案1】:

我建议把它作为单例或会话放在内存中,所有人都这样工作

【讨论】:

  • 您的意思是让图像保持在会话中吗?建议在会话中保留 3 mb 的文件吗
  • 只给所有用户一张,因为所有来自数据库的图片都默认存储在内存中。
猜你喜欢
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多