"无法加载视图状态"错误动态加载用户控件时

时间:2015-04-06 16:01:39

标签: c# asp.net controls viewstate

我有一个用户控件[ascx],这是一个radgrid。它还有一个编辑列模板,允许用户插入/更改/更新值。

我在aspx页面中单击按钮[Say EDIT]时加载此用户控件。

当我点击aspx页面的EDIT按钮时,用户控件完全加载,但是当我点击用户控件的Add New Record时,我收到此错误消息。

  

无法加载视图状态。加载viewstate的控制树必须与用于保存的控制树匹配   在上一个请求期间查看状态。例如,添加时   动态控制,回发期间添加的控件必须匹配   初始期间添加的控件的类型和位置   请求。

//用户控件代码-ascx

<telerik:RadGrid AllowAutomaticDeletes="True"
    AllowAutomaticInserts="False" AllowAutomaticUpdates="False"
    Height="410px" ID="rgrd1" runat="server" AutoGenerateColumns="False"
    OnUpdateCommand="rgrd1_UpdateCommand"
    OnInsertCommand="rgrd1_InsertCommand"  OnNeedDataSource="rgrd1_NeedDataSource" GridLines="None">

    <MasterTableView CommandItemDisplay="top" CommandItemStyle-Wrap="False" CommandItemStyle-HorizontalAlign="Left"
        DataKeyNames="Type">
        <Columns>
            <telerik:GridEditCommandColumn UniqueName="EditColumn" HeaderStyle-HorizontalAlign="left"
                HeaderText="Edit" ButtonType="ImageButton">
            </telerik:GridEditCommandColumn>
            <telerik:GridTemplateColumn DataField="Type" HeaderStyle-HorizontalAlign="left"
                HeaderText="Type" UniqueName="Type">
                <ItemTemplate>
                    <asp:Label ID="TypeLabel" runat="server" Text='<%# Eval("Type") %>'></asp:Label>
                </ItemTemplate>
            </telerik:GridTemplateColumn>

        </Columns>
        <EditFormSettings EditFormType="Template">
            <EditColumn FilterControlAltText="Filter EditCommandColumn1 column" UniqueName="EditCommandColumn1">
            </EditColumn>
            <FormTemplate>
                <table>
                        <td>
                            <telerik:RadTextBox ID="txtType" Width="50" runat="server"  Text='<%# Eval("Type") %>'>
                            </telerik:RadTextBox>

                        </td>
                    </tr>
                </table>
            </FormTemplate>
        </EditFormSettings>

    </MasterTableView>
    <HeaderStyle HorizontalAlign="Center" />
</telerik:RadGrid>

..................................... 我的aspx页面的代码 - 我在Radwindow中加载上面的usercontrol

点击编辑按钮 - 下面的代码我写了

RadWindow window = new RadWindow();
window.Height = Unit.Pixel(500);
window.Width = Unit.Pixel(500);
window.VisibleOnPageLoad = true;
UserControl uc = (UserControl)Page.LoadControl("../../Controls/TypeUserControl.ascx");
uc.EnableViewState = false;
window.ContentContainer.Controls.Add(uc);
pnl.Controls.Add(window);

当我点击usercontrol中的Add New Record时,它会抛出异常&#34;无法加载视图状态:&#34;

我的加载了这个用户控件的aspx页面正由我的BasePage继承。

基页的OnPreRender出现异常

protected override void OnPreRender(EventArgs e)
{
    try
    {
         base.OnPreRender(e);
    }
}

用户控制 - 代码behing

    public partial class TypeUserControl : System.Web.UI.UserControl
{

    protected void rgrd1Types_NeedDataSource(object source, GridNeedDataSourceEventArgs e)
    {
        try
        {
           //dbase call
        }
        catch (Exception ex)
        {
            SetValidationMessage(ex.Message.ToString());
        }
    }

    protected void rgrd1_InsertCommand(object source, GridCommandEventArgs e)
    {
        try
        {
            //dbase call

        }
        catch (Exception ex)
        {
            SetValidationMessage(ex.Message.ToString());
        }
    }

3 个答案:

答案 0 :(得分:0)

我不知道这是否是问题,但您的HTML在表单模板中不正确

                    <table>

                            <td>
                                <telerik:RadTextBox ID="txtType" Width="50" runat="server"  Text='<%# Eval("Type") %>'>
                                </telerik:RadTextBox>

                            </td>
                        </tr>

                    </table>

您错过了开始<tr>标记。这可能与问题有关。

你应该仔细检查所有代码,以确保它是正确的。

-

我也猜测你应该从编辑按钮的OnClick()事件中删除这行代码

    uc.EnableViewState = false;

答案 1 :(得分:0)

您必须在动态添加后重新创建回发控件。 在Init_page Eventhandler中重新创建或添加控件,您可以在那里检查导致回发的事件或控件的类型,以了解您应该重新创建此控件。 你可以发布代码隐藏文件。

编辑: 很久以前,当我这样做的时候。但这是一个有效的例子。 我认为有更好的方法。 检查密钥集合,哪个按钮导致回发,如果它是你的ascx控件中的某个按钮然后读取你的控件到页面或者你把它放在哪里,但它必须在回发时是相同的地方,否则你会得到一个错误,我想。

  

protected override void OnInit(EventArgs e){base.OnInit(e);

      if (this.Page.IsPostBack)           {
          var x = base.DeterminePostBackMode();

          if (x.Keys.Get(3).Contains("btnInControl"))
          {
              Control ctrl = Page.LoadControl("WebUserControl1.ascx");
              this.Page.Form.Controls.Add(ctrl);
          }       
} 
}

答案 2 :(得分:0)

您发布此问题已经过去了一年,但万一有人仍面对此问题:这是此类错误的主要根源。我一直在苦苦挣扎。

  • 修复错误的最简单方法是设置为动态添加的控件:

    EnableViewState = false
    
  • 如果您需要Viewstate,您拥有的其他选项是添加动态onInit添加的控件,或者在每个Postback上重新创建它。

希望它有所帮助。

有关详细信息,请参阅Funkylife's comment