我有一个页面,我通过代码隐藏动态添加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"];
答案 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");