为何无法在PostBack上更新HiddenFields?
作者:互联网
这是我的代码:
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°链接的HiddenField(与MesiSelezionati = new string [] {“ 2”,“ 4”};处的位置相对应)为空.为什么?我该如何解决?
编辑:Mark 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属性(InnerHtml =“ mese”).在后台,此分配为ViewState [“ innerhtml”] =“ mese”.
>在ViewState跟踪开始后,您将css类分配给锚,因此ViewState恢复机制将在回发时应用于此控件.
当您回发带有添加的CSS类的锚标记时,将遵循HtmlContainerControl.LoadViewState(在InitComplete和PreLoad之间发生).如果LoadViewState方法检测到ViewState [“ innerhtml”]具有一个值,它将擦除该控件的所有子控件(调用Controls.Clear()),并创建一个LiteralControl来包含innerhtml值,并将其添加为唯一的子控件.
基本上,这意味着您不能同时设置InnerHtml属性和将任何控件添加到HtmlContainerControl的后代,如果该控件将受到ViewState跟踪.
修正你的例子;与其设置InnerHtml添加链接文本,不如创建具有所需文本的LiteralControl并将其添加到锚点的子控件集合中.
标签:webforms,user-controls,c,net 来源: https://codeday.me/bug/20191201/2079967.html