首页 > 解决方案 > 为什么我的 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 的值,这很奇怪。

标签: c#asp.net

解决方案


尝试以下强制启用控件的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>

推荐阅读