gpt4 book ai didi

c# - 为什么我不能在 PostBack 上更新 HiddenFields?

转载 作者:行者123 更新时间:2023-11-30 16:24:40 25 4
gpt4 key购买 nike

这是我的代码:

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:LinkBut​​ton 调用同一页面(因此,回发)时。我在 if (MesiSelezionati.Contains(hf.ID.Split('_').LastOrDefault())) 上得到一个 System.NullReferenceException

似乎 2° 和 4° 链接的 HiddenField(对应于 MesiSelezionati = new string[] { "2", "4"}; 的位置)为空。为什么?我该如何解决?

编辑:Mark M 的代码

HtmlGenericControl optionBox = new HtmlGenericControl("div");
optionBox.Attributes["class"] = "option-box";

HtmlGenericControl optionBoxItem = new HtmlGenericControl("a") { InnerHtml = "&nbsp;" };
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 时,尚未使用请求和 View 状态值填充控件。您的更新正在被覆盖。

编辑:我找到了您问题的根本原因并在此过程中学到了一些东西。

  1. 您在 OnInit 方法中设置 anchor 标记的 InnerHtml 属性 (InnerHtml = "mese")。在幕后,这个分配是 ViewState["innerhtml"] = "mese"
  2. 在 ViewState 跟踪开始后,您将 css 类分配给 anchor ,因此 ViewState 恢复机制将在回发时应用于此控件。

当您回发带有添加的 css 类的 anchor 标记时,将受制于 HtmlContainerControl.LoadViewState(发生在 InitComplete 和 PreLoad 之间)。如果 LoadViewState 方法检测到 ViewState["innerhtml"] 有一个值,它会清除该控件的所有子控件(调用 Controls.Clear())并创建一个 LiteralControl 来包含 innerhtml 值,并将其添加为唯一的子控件。

基本上这意味着您不能同时设置 InnerHtml 属性并将任何控件添加到 HtmlContainerControl 的后代,如果该控件将永远受到 ViewState 跟踪的话。

修正你的例子;不要设置 InnerHtml 来添加链接文本,而是创建一个包含所需文本的 LiteralControl 并将其添加到 anchor 的子控件集合中。

关于c# - 为什么我不能在 PostBack 上更新 HiddenFields?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10603185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com