我做了一个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,因此只发送了渲染的控制字符串。现在它工作得很好。
答案 0 :(得分:1)
所有控件都使用ViewState来存储属性和设置。即使手动关闭它,控件也会在内部生成少量的ViewState。如果从WCF服务返回呈现控件的HTML,然后将页面发回服务器,则会抛出错误,因为在解密ViewState以重建页面时,Page对动态加载的控件一无所知。
正如您在问题评论中提到的那样,在将HTML发送到客户端之前手动剥离ViewState将解决您的问题。
我强烈推荐Dave Reed阅读this article on ViewState。这是迄今为止ViewState工作原理的最佳解释(以及您可能对此有何误解)。