c# - 为什么我的 asp:hiddenfield 不工作,但我的标签是?
问题描述
我有一个非常奇怪的问题,试图从使用母版页的页面中的 ASP.NET HiddenField 控件中获取值。我有一个页面,我显示一个标签和一个隐藏字段控件。当用户调用页面时,我将值设置为两个控件,并且在查看 HTML 源代码时可以看到分配的值:
这是我的设置。
test.aspx
<asp:Label ID="lbl_total" runat="server"></asp:Label>
<asp:HiddenField ID="hdn_total" runat="server" />
<asp:Button ID="btn_test" runat="server" Text="Get Value" OnClick="btn_test_Click" />
在后面的代码中,我为两个控件设置了值:
lbl_total.Text = "10";
hdn_total.Value = "10";
当我打开 text.aspx 时,我可以看到控件中正确设置的值:
<span id="panel_body_lbl_label">10</span>
<input type="hidden" name="ctl00$panel_body$hdn_total" id="panel_body_hdn_total" value="10" />
到目前为止,一切都很好。当我按下按钮控件时,问题就开始了:
<asp:Button ID="btn_test" runat="server" Text="Get Value" OnClick="btn_test_Click" />
当我按下提交按钮时,在后面的代码中我有以下内容:
protected void btn_test_Click(object sender, EventArgs e)
{
try
{
Response.Write("hdn_total=" + hdn_total.Value);
}
catch(Exception ex)
{
Response.Write(ex.message);
}
}
hdn_total.Value 的值为空。但是,我仍然可以获得 lbl_total.Text 的值
我从未见过这样的问题发生。通常我总是可以毫无问题地从隐藏字段中获取值。我一定遗漏了一些非常明显的东西,但是在看了两天之后,我需要一些帮助来解决这个问题,非常感谢。
更新 - 在下面添加我的 .aspx.cs 文件,但没有明显的命名空间
protected void Page_Load(object sender, EventArgs e)
{
try
{
if (!IsPostBack)
{
}
}
catch (Exception ex)
{
Response.Write(ex.Message + ex.Source + ex.InnerException + ex.StackTrace);
}
}
protected void btn_test_Click(object sender, EventArgs e)
{
try
{
Response.Write("lbl_total=" + lbl_total.Text);
Response.Write("hdn_total=" + hdn_total.Value.Trim());
return;
}
catch (Exception ex)
{ Response.Write("<!-- debug =" + ex.Message + ex.InnerException + ex.Source + ex.StackTrace + "-->"); }
}
protected void grdTest_DataBound(object sender, EventArgs e)
{
if (ShoppingCart.Instance.Items == null)
{
cart_footer.Visible = false;
}
else
{
if (grdCart.Items.Count() == 0)
{ return; }
string price_format = SiteConfiguration.configValue("price_format");
string total = String.Format(price_format, ShoppingCart.Instance.GetSubTotal());
if (!string.IsNullOrEmpty(total))
{
lbl_total.Text = total;
hdn_total.Value = Convert.ToString(ShoppingCart.Instance.GetSubTotal());
}
else
{
cart_footer.Visible = false;
}
}
}
我在 test.aspx 页面上使用了一个列表视图,但是我的 lbl_total 和 hdn_total 控件在列表视图之外,所以应该没有任何区别。我将值设置为 OnDataBound 上的两个控件,因为我从列表视图中检索值。当我访问 test.aspx 文件时,我确实正确获取了两个控件的值,因为我在浏览器中查看 HTML 源代码时可以看到它们。问题是当我单击提交按钮时,它应该读取两个控件的值,仅此而已,但我只得到 lbl_test 而不是 hdn_test 的值,这很奇怪。
解决方案
尝试以下强制启用控件的ViewState,因为默认情况下它是从容器继承的。将ClientIDMode设置为 Static 也没有什么坏处,因此控件 ID 不会被 ASP.NET 破坏。
<asp:HiddenField ID="hdn_total" runat="server" ClientIDMode="Static" ViewStateMode="Enabled" />
您可能想尝试的另一个选项是将控件放在UpdatePanel中。
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Label ID="lbl_total" runat="server"></asp:Label>
<asp:HiddenField ID="hdn_total" runat="server" ClientIDMode="Static" ViewStateMode="Enabled" />
<asp:Button ID="btn_test" runat="server" Text="Get Value" OnClick="btn_test_Click" />
</ContentTemplate>
</asp:UpdatePanel>
推荐阅读
- php - 如何在 OpenCart 3 模块管理面板中显示媒体库中的图像选择字段
- clojure - Clojure中打印可变数量命令行参数的紧凑方式?
- c - 如何将已编译的“.so”库与 Scons 链接?
- mysql - 我可以使用 gorm 将 MySQL 中的现有字段增加一个吗?不使用原始 SQL
- json - 用于创建 Github 存储库的 Curl 命令不起作用
- python - 选择项目并通过鼠标单击从 QlistWidget 更新 QLineedit?
- vb.net - 当文本转换为大写时,Windows Search 无法找到文件
- python - 网页抓取拦截器
标签
- c# - WPF WebView2 - 无法禁用上下文菜单
- c# - C#如何将字符串变量视为插值字符串?