为什么我不能在回发上更新隐藏字段
本文关键字:更新 隐藏 字段 不能 为什么 | 更新日期: 2023-09-27 18:34:17
这是我的代码:
private string[] MesiSelezionati;
protected void Page_Load(object sender, EventArgs e)
{
MesiSelezionati = new string[] { "2", "4" };
UpdateMesi();
}
override protected void OnInit(EventArgs e)
{
for (int i = 1; i <= 12; i++)
{
HtmlGenericControl meseItem = new HtmlGenericControl("a") { InnerHtml = "mese" };
meseItem.Attributes.Add("href", "javascript:void(0);");
HiddenField hf = new HiddenField();
hf.Value = "0";
hf.ID = "idMese_" + i.ToString();
meseItem.Controls.Add(hf);
panelMesi.Controls.Add(meseItem);
}
base.OnInit(e);
}
private void UpdateMesi()
{
foreach (HtmlGenericControl a in panelMesi.Controls.OfType<HtmlGenericControl>())
{
HiddenField hf = a.Controls.OfType<HiddenField>().LastOrDefault();
if (MesiSelezionati.Contains(hf.ID.Split('_').LastOrDefault()))
{
hf.Value = "1";
a.Attributes.Add("class", "box-ricerca-avanzata-item link-box selected");
}
}
}
当我调用页面时,一切都很好!问题是当我调用同一页面(所以,回发(时,这要归功于asp:LinkButton。我对if (MesiSelezionati.Contains(hf.ID.Split('_').LastOrDefault()))
System.NullReferenceException
.
似乎 2° 和 4° 链接的隐藏场(对应于 MesiSelezionati = new string[] { "2", "4" };
处的位置(为空。为什么?我该如何解决它?
编辑:马克M的代码
HtmlGenericControl optionBox = new HtmlGenericControl("div");
optionBox.Attributes["class"] = "option-box";
HtmlGenericControl optionBoxItem = new HtmlGenericControl("a") { InnerHtml = " " };
optionBoxItem.Attributes.Add("href", "javascript:void(0);");
optionBoxItem.Attributes.Add("class", "option-box-item");
HtmlGenericControl optionBoxTesto = new HtmlGenericControl("a") { InnerText = Categoria.Categoria };
optionBoxTesto.Attributes.Add("href", "javascript:void(0);");
optionBoxTesto.Attributes.Add("class", "option-box-testo");
HiddenField hf = new HiddenField();
hf.Value = "0";
hf.ID = "categoria_" + Categoria.UniqueID;
optionBox.Controls.Add(optionBoxItem);
optionBox.Controls.Add(optionBoxTesto);
optionBox.Controls.Add(hf);
panelCategorieGuida.Controls.Add(optionBox);
您可以在回发时更新隐藏字段,只是不能在加载之前更新。执行 OnInit 时,尚未使用请求和视图状态值填充控件。您的更新将被覆盖。
编辑:我找到了您问题的根本原因,并在此过程中学到了一些东西。
- 在 OnInit 方法中设置定位标记 (
InnerHtml = "mese"
( 的 InnerHtml 属性。 在封面下,此作业ViewState["innerhtml"] = "mese"
. - 在 ViewState 跟踪开始后,将 css 类分配给定位点,因此 ViewState 还原机制将在回发时应用于此控件。
当您回发时,添加了 css 类的锚标记将受 HtmlContainerControl.LoadViewState 的约束(发生在 InitComplete 和 PreLoad 之间(。 如果 LoadViewState 方法检测到 ViewState["innerhtml"] 具有值,它将清除控件的所有子控件(调用 Controls.Clear(((,并创建一个 LiteralControl 以包含 innerhtml 值,并将其添加为唯一的子控件。
基本上,这意味着您无法同时设置 InnerHtml 属性并将任何控件添加到 HtmlContainerControl 的后代(如果该控件将受到 ViewState 跟踪(。
若要修复示例;不要将 InnerHtml 设置为添加链接文本,而是使用所需文本创建一个 LiteralControl,并将其添加到定位点的子控件集合中。
您的链接按钮是否在某个单独的面板控件中?您是否正在使用 AJAX 进行部分回发?很抱歉回答这个问题。