3

これは私のコードです:

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 のおかげで同じページ (つまり、ポストバック) を呼び出すときです。私は上に取得System.NullReferenceExceptionif (MesiSelezionati.Contains(hf.ID.Split('_').LastOrDefault()))ます。

2° と 4° のリンク ( の位置に対応する) の HiddenFieldMesiSelezionati = new string[] { "2", "4" };が null のようです。なんで?どうすれば修正できますか?

編集:マーク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);
4

2 に答える 2

3

ロードの直前ではなく、ポストバックで非表示フィールドを更新できます。OnInitを実行するとき、コントロールはリクエストとビューステートの値を使用して設定されていません。更新は上書きされています。

編集:私はあなたの問題の根本的な原因を見つけ、その過程で何かを学びました。

  1. InnerHtml = "mese"OnInitメソッドでアンカータグ()のInnerHtmlプロパティを設定します。カバーの下で、この割り当てはViewState["innerhtml"] = "mese"です。
  2. ViewStateの追跡が開始された後にcssクラスをアンカーに割り当てるので、ViewStateの復元機構がポストバックでこのコントロールに適用されます。

cssクラスが追加されたアンカータグをポストバックすると、HtmlContainerControl.LoadViewState(InitCompleteとPreLoadの間で発生します)の対象になります。LoadViewStateメソッドがViewState["innerhtml"]に値があることを検出すると、コントロールのすべての子コントロールを消去し(Controls.Clear()を呼び出し)、innerhtml値を含むLiteralControlを作成して、それを唯一の子コントロールとして追加します。

基本的に、これは、InnerHtmlプロパティを設定することも、HtmlContainerControlの子孫にコントロールを追加することもできないことを意味します(コントロールがViewStateトラッキングの対象になる場合)。

あなたの例を修正するには; リンクテキストを追加するようにInnerHtmlを設定する代わりに、目的のテキストを使用してLiteralControlを作成し、アンカーの子コントロールコレクションに追加します。

于 2012-05-15T14:50:22.113 に答える
0

リンクボタンは別のパネルコントロールにありますか?AJAXを使用して部分的なポストバックを実行している場合はありますか?質問に答えてすみません。

于 2012-05-15T17:40:13.377 に答える