我需要从localStorage获取一个值(ClientId)到代码隐藏。使用上一个会话的“客户端”设置登录时非常方便,该会话存储在:
C#:
string script = string.Format("localStorage.clientId = '{0}';", _MySession.CurrentClientId);
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "key", script, true);
(请参阅:this SO question)
要使数据从localStorage返回到代码隐藏,asp.HiddenField
元素似乎是为此而制作的:可以轻松地使用JavaScript编写该元素,并可以从代码隐藏中读取该元素:
HTML:
<asp:HiddenField ID="hf_ClientId" runat="server" />
JS:
document.getElementById("<%=hf_ClientId.ClientID%>").value = localStorage.clientId;
代码隐藏,C#(在母版页中):
var v = hf_ClientId.Value;
但是,其背后的代码在Page_Load中,并且在之前运行,因此html被构造并且JS在$(document)中运行。就绪,因此没有接收到任何值。
然后,我尝试将JS移至theForm.onsubmit
作为挂钩运行的__doPostBack
。我使用Firefox F12调试器和VisualStudio C#调试器,通过单击表单上的某些按钮,验证了回发后立即在C#之前调用JS,但在那里仍然没有收到值。
我做错了什么以及如何解决?
答案 0 :(得分:2)
阅读{{3}}时,我尝试了一个更简单的隐藏字段:
HTML:
st_within()
C#:
<input type="hidden" id="hf_ClientId" name="hf_ClientId" />
JavaScript也更简单,因为runat = server属性消失了:
JS:
if (IsPostBack)
string StoredClientId = Request.Form["hf_ClientId"];
或者使用jQuery(未经测试的val语法可能是错误的):
document.getElementById("hf_ClientId").value = localStorage.clientId;
这有效,现在有数据。
作为奖励,C#部分可以位于隐藏字段所在的母版页中,也可以在主页中。只需添加一条评论,因为它有点像意大利面条。
因为对我来说,这是一个登录页面,所以此C#代码位于“登录”按钮的回调中,因此它始终是回发。简单!
答案 1 :(得分:1)
我认为,您正在调试第一个(初始)请求。此处未设置HiddenField。 要查看HiddenField值,必须在代码发布到服务器后调试它。 尝试在您的Load事件中添加检查:
if (Page.IsPostBack)
{
//Here you can read your hidden field
}
答案 2 :(得分:0)
尝试将准备就绪的文档添加到javascript调用的代码中
{{1}}