C# 为什么可以';我不能在回发时更新隐藏字段吗?

C# 为什么可以';我不能在回发时更新隐藏字段吗?,c#,.net,user-controls,webforms,C#,.net,User Controls,Webforms,这是我的代码: 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++)

这是我的代码:

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");
        }
    }
}

您可以在回发时更新隐藏字段,而不是在加载之前。在执行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进行部分回发?很抱歉回答了这个问题。

    我认为情况并非如此。这很奇怪,因为在另一个上下文中(使用相同的代码,但使用“div”而不是“a”)是有效的还有,问题是当我回发时,而不是调用页面时(事实上,在加载时调用页面,它会更新值)OWell,因为它只发生在回发时,我怀疑与加载视图状态有关,所以我插入了许多生命周期事件处理程序,以缩小问题发生的时间范围。一旦我在InitComplete和Load事件之间找到它,我97%确定它是LoadViewState,所以我下载了JetBrains反编译器并从HtmlGenericControl反向工作,直到找到实现LoadViewState的类并检查它。
    a
    受其约束,因为在激活视图状态跟踪(从加载到预渲染都处于活动状态)后,您向其添加了class属性。但是在我的另一个代码上,我使用了
    div
    而不是
    a
    ,我还对其应用了
    class
    属性,并使用InnerHtml。。。但是没有任何问题:OI认为更好的选择是抛出异常,而不是默认不太可能符合编码者意图的行为。InnerHTML和添加子控件是用子内容填充控件的两种不同且完全独立的方法。如果我设置InnerHTML并添加子控件,没有自动确定我想要什么的方法(我想要InnerHTML内容是第一个还是最后一个?我是否感到困惑,只是想使用这两个选项中的一个?),因此应该抛出一个异常,IMO。这真的很奇怪!我真的不明白为什么会有这种行为:O看起来像是丢失了,在回发时,Page_Load的更新控件,我第一次调用它??????该死…你凭什么认为是更新?您应该检查空引用出现的位置和原因。。回发时没有任何理由让HiddenFields为null。这是我不明白的问题。回发时,2°和4°链接上的HiddenField(第一次调用页面时值已更新的链接)为空。为什么?这就是我需要解决的问题。他们更新了,是的!当我第一次调用页面时,我看到的值是“1”,而不是“0”。所以问题是,事实上,在回发时。。。
    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);