解决视图状态/命名空间冲突

时间:2009-10-29 16:40:37

标签: c# asp.net custom-controls viewstate naming-containers

我有一个列表框控件。当用户单击它时,它会告诉自定义控件使用某个ID。

自定义控件每次(动态)绘制相同的内容,只是根据此ID加载不同的内容(它从数据库加载到动态形式,如控件)。

好的,现在我遇到了viewstate溢出问题。当您单击列表框以加载说出ID#1时,它们看起来都很好。然后,单击ID#2,在自定义控件中创建的所有文本框控件都与ID#1中的相同。因此,当列表框索引发生更改时,我需要清除视图状态,但我无法使其工作。

所有控件也在Page_Load中创建。

我在Page_Load尝试了ViewState.Clear(),但没有做任何事情。

我的自定义控件来自INamingInterface,但我猜这些ID仍然匹配于viewstate。

我尝试将自定义控件ID更改为唯一的(例如“CONROL _”+ id.ToString())我也尝试使用包含自定义控件的面板执行相同的操作。

我似乎无法摆脱这种观点状态!

EDIT 好的,这是演示问题的代码

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”(最好不要完全禁用viewstate)

3 个答案:

答案 0 :(得分:1)

如果我设置了Text控件的ID,那么它不会保留旧值。您是否为所有控件提供了唯一的ID?

void Create(string text)
{ 
    TextBox t = new TextBox();
    t.ID = text;
    t.Text = text;
    pnl.Controls.Add(t);
}

答案 1 :(得分:0)

你不能这样做。

要使viewstate正常工作,必须在加载所有控件之前创建所有控件并使用相同的id。因此,您必须将控件定义存储在会话中,然后使用相同的ID重新创建ASP.NET,从视图状态加载其属性。 Page_load为时已晚,请在PreLoad中进行。

但是在设计时创建所有控件并将可见设置设置为false更容易,并替换它们的可见性,以便viewstate正常工作。

答案 2 :(得分:0)

实际上这不再相关。我们通过为动态创建的控件禁用viewstate来修复它。这在所有情况下都不起作用,但在我们的例子中,用户可以按下两个按钮(与动态控件有关)或用于切换表单的列表框。这两个按钮都将控件的状态保存到数据库中,因此实际上并不需要viewstate。(在考虑viewstate以及它如何与控件交互时,我总是感到困惑。)

基本建议:如果您在控制视图状态时遇到问题,请确保确实需要它。