将Ajax的UserControl与WCF一起使用后,ViewState无效

时间:2011-04-26 08:45:45

标签: asp.net viewstate

我做了一个UserControl,实现了“喜欢”的行为,facebook风格。

当命中“Like”(或“不同”)时,控件向启用Ajax的WCF服务发送请求,该服务又手动呈现用户控件并将结果发送回客户端。

一切正常,但它会导致同一页面中的其他控件生成以下JavaScript错误:

Message: Sys.WebForms.PageRequestManagerServerErrorException: The state information is invalid for this page and might be corrupted.

URI: http://somesite/ScriptResource.axd?d=GF84PA...

只有当我按下喜欢/不同按钮,然后在需要回调的页面上尝试某些内容时才会出现错误,例如在ListView中进行分页或提交评论。

我正在使用C#,ASP.NET,.NET 3.5。

编辑: 我在WCF中呈现UserControl的代码如下所示:

    public string RenderHtml()
    {
        var pageHolder = new Page();
        var formControl = new HtmlForm();
        var userControl = (TControl)pageHolder.LoadControl(userControlPath);

        if (setControlPropertiesDelegate != null)
            setControlPropertiesDelegate(userControl);

        formControl.Controls.Add(userControl);
        pageHolder.Controls.Add(formControl);
        var output = new StringWriter();
        HttpContext.Current.Server.Execute(pageHolder, output, false);
        var outputString = output.ToString();
        return outputString;
    }

我发现由于我在页面和表单中呈现控件,因此创建了一个ViewState隐藏字段(因此通过WCF发送到客户端)。 我在return语句之前添加了一个方法,它删除了form标记和ViewState,因此只发送了渲染的控制字符串。现在它工作得很好。

1 个答案:

答案 0 :(得分:1)

所有控件都使用ViewState来存储属性和设置。即使手动关闭它,控件也会在内部生成少量的ViewState。如果从WCF服务返回呈现控件的HTML,然后将页面发回服务器,则会抛出错误,因为在解密ViewState以重建页面时,Page对动态加载的控件一无所知。

正如您在问题评论中提到的那样,在将HTML发送到客户端之前手动剥离ViewState将解决您的问题。

我强烈推荐Dave Reed阅读this article on ViewState。这是迄今为止ViewState工作原理的最佳解释(以及您可能对此有何误解)。