获得动态添加的HiddenField的价值

时间:2014-04-04 13:59:50

标签: asp.net hidden-field

我有一个页面,我通过代码隐藏动态添加HiddenFields。我正在从列表中添加这些HiddenFields(HF)中的每一个,我必须尝试获取此列表的值的代码是:

// Get the name of the hidden field using a specific cell in a grid.
string controlName = "hidden_value_" + grdMyGrid.Rows[i].Cells[1].Text;
HiddenField field = (HiddenField)this.FindControl(controlName);
string fieldValue = field.Value;

但是field返回null。我试过this.Page.FindControl,但结果相同。

所以我想知道的是因为HiddenFields在源中的位置?以下是定位示例,其中HF位于主HTML之外。如果是这种情况,我怎么才能真正获得这些字段?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="head">
    <script type="text/javascript">
        // Random script here, not important
    </script>
<body>

    // Main body of my code, lots of different controls.  Not connected to
    // the HiddenFields at the very bottom.

</body>
</html>
<asp:HiddenField id='hidden_value_MyValue1' runat='server' value='1' /><asp:HiddenField id='hidden_value_MyValue2' runat='server' value='2' /><asp:HiddenField id='hidden_value_MyValue3' runat='server' value='3' />

编辑 - 更新代码 这就是我现在将隐藏值添加到页面的方式

                foreach (var product in products)
                {
                    string hiddenValueControl = "<input type='hidden' id='hidden_value_" + product.Description +
                                                "' runat='server' value='" + product.AlphaKey + "' />";
                    productLiteral.Text = productLiteral.Text + hiddenValueControl;
                }

我怎样才能获得其中一个值?我试过这个,但最终返回null

         string tempProductId =
                     Request.Form["hidden_value_" + "MyProductName"];

1 个答案:

答案 0 :(得分:0)

  

...我正在通过代码隐藏动态添加HiddenFields ......

请确保您在页面生命周期中(在Page_Load之前)尽早添加这些内容,否则在回发期间将无法检索它们,因为它们不会正确添加到ViewState中。

有关详细信息,请参阅MSDN上的the ASP.NET Page life cycle overview文章。它建议使用Page_PreInit事件来添加/重新添加动态控件(尽管大多数时候我看到人们使用Page_Init而没有问题)。

如果您展示了动态添加HiddenField控件的代码,只是为了证实这一理论,将会很有帮助。

此外,您展示的标记有点令人困惑。您说您正在动态添加HiddenFields,但您的标记显示至少一个以声明方式创建的标记。将HTML控件置于<html>标记之外并不常见。你应该将它们移到里面。并确保HiddenField控件位于<form runat="server">标记内。


编辑之后,我发现似乎对如何动态地向ASP.NET页面添加控件感到困惑。您不希望构建ASP.NET服务器控件标记的文本。您可以使用Web控件类构建实际控件,然后将其添加到页面上的容器中。

你想要做的是在你的页面底部添加一个PlaceHolder控件(你想要HiddenFields的地方):

<asp:PlaceHolder ID="hiddenControlContainer" runat="server" />

然后你将使用与你所拥有的逻辑类似的逻辑来创建和添加控件,但不是构建字符串,而是构建控件:

foreach (var product in products)
{
    HiddenField productField = new HiddenField();
    productField.ID = "hidden_value_" + product.Description;
    productField.Value = product.AlphaKey;

    hiddenControlContainer.Controls.Add(productField);
}

注意:正如我上面提到的,你应该这样做是 Page_Init,以确保以后可以检索它。

然后你会像这样检索控件:

HiddenField myField = (HiddenControl)hiddenControlContainer.FindControl("hidden_value_" + "MyProductName");