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时,没有使用请求和视图状态值填充控件。您的更新正在被覆盖 编辑:我找到了你问题的根本原因,并在这个过程中学到了一些东西
InnerHtml=“mese”
)的InnerHtml属性。在封面下,此作业是ViewState[“innerhtml”]=“mese”
修正你的榜样;不要将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 = " " };
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);