为什么我不能在回发上更新隐藏字段

本文关键字:更新 隐藏 字段 不能 为什么 | 更新日期: 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 = "&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 时,尚未使用请求和视图状态值填充控件。您的更新将被覆盖。

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

  1. 在 OnInit 方法中设置定位标记 ( InnerHtml = "mese" ( 的 InnerHtml 属性。 在封面下,此作业ViewState["innerhtml"] = "mese" .
  2. 在 ViewState 跟踪开始后,将 css 类分配给定位点,因此 ViewState 还原机制将在回发时应用于此控件。

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

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

若要修复示例;不要将 InnerHtml 设置为添加链接文本,而是使用所需文本创建一个 LiteralControl,并将其添加到定位点的子控件集合中。

您的链接按钮是否在某个单独的面板控件中?您是否正在使用 AJAX 进行部分回发?很抱歉回答这个问题。