【问题标题】:Viewstate not preserved when handling exception处理异常时未保留视图状态
【发布时间】:2012-10-04 09:59:23
【问题描述】:

我正在使用详细信息视图与用户对话,当插入数据出错时,似乎没有保留视图状态。

我在数据源上使用 OnInserted 处理程序来检查是否有类似这样的异常:

protected void areaInsertHandler(Object sender, SqlDataSourceStatusEventArgs e)
    {
        if (e.Exception != null)
        {
            // There was an error in submitting, show the error dialog
            ScriptManager.RegisterClientScriptBlock(Page, GetType(), "DialogHandler", "showError('#overlayAreas');", true);
            e.ExceptionHandled = true;
        }
    }

简单的调用客户端JS函数:

function showError(overlayName) {
    $(".msgError").css('visibility', 'visible');
    $(overlayName).css('visibility', 'visible');
}

我的详细信息视图如下所示:

<asp:UpdatePanel ID="AreaUP" runat="server" UpdateMode="Conditional">
  <ContentTemplate>
    <div id="overlayAreas" class="overlay">
        <asp:DetailsView 
            ID="DetailsView_Areas"
            runat="server"
            Visible="True"

            AutoGenerateInsertButton="False"
            AutoGenerateRows="False"

            caption="<a style='font-weight: bold;'>Bold</a> = Required field"
            CaptionAlign="Bottom"
            headertext="Create new area"   
            EnableViewState="true"

            DataKeyNames="Area_Name"
            DataSourceID="AreasSource"
            DefaultMode="Insert">
                <Fields>
                    ...
                </Fields>
        </asp:DetailsView>
    </div>

    <br />
    <asp:Button width="200" height="30"  ID="Button_CreateArea" runat="server" OnClientClick="return btnToggle('#overlayAreas')" Text="Create new area" />
    </ContentTemplate>
</asp:UpdatePanel>

一切正常,但由于某种原因,没有保留 ASP 视图状态。这意味着如果我在表单中填写了不正确的信息并提交,我将收到相应的错误,并且仍将显示对话框。但是这些字段没有填写我的旧值。

如果有人能给我一些建议或帮助我,我将不胜感激

编辑 10-08:仍然无法解决它,有什么想法吗?

【问题讨论】:

  • 可能是您正在使用旧版本的 ASP.NET 框架,如果在页面、用户控件和母版页声明中设置了 enableviewstate,则无法在页面上的控件中覆盖它?
  • @TorAndersson,别这么认为,我的目标是 .NET 框架 4

标签: c# asp.net .net web viewstate


【解决方案1】:

基本上:

  1. 避免 DetailsView_Areas.DataBind()

        if (DetailsView_Areas.CurrentMode != DetailsViewMode.Insert) DetailsView_Areas.DataBind(); 
    
  2. 为您的 DetailsView_Areas 创建 ItemInserted 事件并放置

        if (e.AffectedRows < 0) e.KeepInInsertMode = true;
    

见http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.detailsviewinsertedeventargs.affectedrows(v=vs.110).aspx

【讨论】:

    猜你喜欢
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多