如何修复错误:无法解析从服务器接收到的消息

19
我们有一个使用 AJAX 的 Sharepoint 解决方案。触发它的按钮位于更新面板内部。
我们需要做的其中一件事是生成一个 MS Word 文档,然后在客户端上打开,以便可以打印。
将文档发送到客户端的代码如下:
    void OpenFileInWord(byte[] data)
    {
        Response.Clear();
        Response.AddHeader("Content-Type", "application/msword");
        Response.BinaryWrite(data);
        Response.Flush();
        Response.End();
    }

我们遇到的错误是:

信息:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器收到的消息。导致此错误的常见原因是响应被 Response.Write() 调用、响应过滤器、HttpModule 或启用了服务器跟踪等修改。 详细信息:解析错误附近的问题为'<?mso-application pr'。

我们可以先将文档保存在Sharepoint中,然后再从Sharepoint中打开,但我们不想这样做。

10个回答

34
如果您的按钮在updatepanel内部,可能会导致这种情况。如果不想移动它,只需在updatepanel上为该按钮添加触发器,即一个postback触发器。

1
很好的回答。我的问题已经得到解决。感谢你的建议。 - Ashok kumar
我的问题也解决了,非常感谢!! - MBahamondes

24

触发执行此代码的行为必须是一个postback事件,而不是AJAX调用。

这是由于处理AJAX请求的方式的特性所决定的。


1
啊,我在.NET中的Update Panel中有一个按钮。将其拿出来后就像魔法一样好用! - ShinyCy

7

将按钮放在更新面板外,它就可以正常工作。


6
将您的按钮设置为像这样引起完整的回发:
 <Triggers>
<asp:PostBackTrigger ControlID="PrintButton" />
</Triggers>

4

尝试在页面加载中添加脚本管理器,像这样:

((ScriptManager)Master.FindControl("ScriptManager1")).RegisterPostBackControl(btnExport);

1
我在 asp:UpdatePanel 控件内使用了 asp:Table 控件。表格中有一些静态行和一些行在 Postback 事件期间添加。
出现此错误的原因是表格的行和列没有静态 ID。因此,每次 Postback 时 ID 都会更改,这会导致恢复表格 ViewState 出现问题。
为了解决此错误,我禁用了表格的 ViewState:EnableViewState="false" <asp:Table ID="PageContentTable" runat="server" ... EnableViewState="false">

1
在您的按钮点击时,重定向到另一个页面,该页面可以流式传输任何文件,您可能希望使用此类型的文件。我们在许多网站中使用document.aspx页面,然后通过查询字符串传递文档ID并从那里流式传输文件。
在您的示例中,您基本上正在尝试更改已经显示的页面的标头,这是不允许的。

在你的例子中,你基本上试图更改已经显示的页面的标题,这是不允许的。它是允许的,没有必要为此创建单独的页面。 - Viral Jain

1

对我来说,问题在于网格视图的模板列中存在重复的控件ID。一旦我将这些控件重命名为全局唯一的名称,问题就消失了!


0

我为此苦苦挣扎了几个小时。在我的WebForms Code-Behind文件中进行ajax请求并没有起作用,使用UpdatePanel会导致烦人的错误,而我也找不到解决方案。最终,我找到了一个可行的解决方案!

在项目中的某个地方创建一个`.ashx`(通用处理程序)文件。我把它创建在一个顶级服务文件夹中,所以是`Services\EventsHandler.ashx`。这样做后,你会得到一个`.ashx`和一个`.ashx.cs`文件。
在`ashx.cs`文件中,你会找到一个`ProcessRequest`方法,在这个方法中你可以放置所有的代码。
你可以在你的JavaScript文件中使用类似以下方式调用这个方法:
```javascript $('#MyButton').click(function () { var zipCode = $('#FBZipBox').val();
$.getJSON('/Services/EventsHandler.ashx?zip=' + zipCode, function (data) { var items = []; $.each(data.Results, function (key, item) { items.push('item.Date'); }); }).complete(function () { // 更多逻辑 }); return false;}); ```
在你的`ashx.cs`文件中,你可以使用以下方法来访问查询参数:
```csharp var category = context.Request.QueryString["zipCode"]; ```
然后,你可以使用以下方法返回结果:
```csharp context.Response.Write(yourResponseString); ```

0

我把按钮周围的更新面板移除了,然后它就工作正常了。


这个问题已经有一个解决方案,不需要对应用程序进行任何重大的架构更改。 - Michael J. Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接