リストボックスコントロールがあります。ユーザーがクリックすると、特定のIDを使用するようにカスタムコントロールに指示します。
カスタムコントロールは毎回(動的に)同じものを描画し、このIDに応じて異なるコンテンツをロードするだけです(データベースからコントロールのような動的な形式にロードされます)。
さて、ビューステートの流出に問題があります。リストボックスをクリックしてID#1を読み込むと、すべて見栄えがします。次に、ID#2をクリックすると、カスタムコントロール内に作成されたすべてのテキストボックスコントロールは、ID#1に配置されたものと同じものになります。したがって、リストボックスインデックスが変更された場合、ビューステートをクリアする必要がありますが、これを機能させることはできません。
すべてのコントロールはPage_Loadでも作成されます。
Page_LoadでViewState.Clear()を試しましたが、何もしませんでした。
カスタムコントロールをINamingInterfaceから派生させましたが、IDはまだビューステートと一致していると思います。
カスタムコントロールIDを一意のもの( "CONROL _" + id.ToString()など)に変更してみました。カスタムコントロールを含むパネルでも同じことを試しました。
私はこのビューステートを取り除くことができないようです!
編集OKここに問題を示すコードがあります
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (ddl.SelectedValue == "1")
{
Create("ID #1");
}
else if (ddl.SelectedValue == "2")
{
Create("ID #2");
}
}
void Create(string text)
{
TextBox t = new TextBox();
t.Text = text;
pnl.Controls.Add(t);
}
}
マークアップ:
<div>
<asp:Panel ID="pnl" runat="server">
<asp:DropDownList ID="ddl" runat="server" AutoPostBack="True">
<asp:ListItem Text="id 1" Value="1">
</asp:ListItem>
<asp:ListItem Text="id 2" Value="2"></asp:ListItem>
</asp:DropDownList>
</asp:Panel>
</div>
このコードを実行すると、テキストボックスの内容を変更してからドロップダウンリストを変更すると、前に入力した内容が上書きされるのではなく、そこに保持されることに気付くでしょう。
これに関する私の基本的な目標は、ID#2に変更したときに、テキストボックスに「ID#2」が何があっても(できればビューステートを完全に無効にせずに)配置するようにすることです。