【发布时间】: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