因此我被要求可以选择从数据库下载/创建XML文件。该表包含一个包含原始XML消息的列。用户需要能够保存XML文档以供查看。
所以我在一个单独的程序中测试了我的下载,它可以完美地工作,下载和创建XML Doc,但出于某种原因,WONT在实际程序中下载/创建。
所以我创建了一个存储过程来调用XML Message = to QueueId。
Button位于数据网格中(我们正在使用Telerik)
所以我使用MemoryStream和一个streamwriter将XML写入文档。这是我的代码:
private void DownloadXml()
{
try
{
MemoryStream stream = null;
if (grdMessages.SelectedItems.Count > 0)
{
foreach (GridDataItem item in grdMessages.SelectedItems)
{
int queueId = int.Parse(item["QueueId"].Text);
ibis_GetXmlTextResult result = Client.IbisGetClient(Endpoint).ibis_GetXmlText(queueId);
stream = new MemoryStream();
var r = result.XmlMessage.ToString();
//r = "Hello this is my file:)"; //This was only to test it if worked
using (StreamWriter writer = new StreamWriter(stream))
{
writer.Write(r);
writer.Flush();
}
WriteToPage(stream.ToArray(), "text/plain; charset=UTF-8", string.Format("{0}_ClientXml.xml", queueId));
//WriteToPage(stream.ToArray(), "text/xml; charset=UTF-8", "ClientXml.xml");
}
}
}
catch (Exception ex)
{
LogException(ex, "Demand Filter", "Well that didn't work. Check for error " + ex.StackTrace);
}
}
private void WriteToPage(byte[] data, string contentType, string fileName)
{
HttpResponse response = Page.Response;
response.Clear();
response.ClearContent();
response.ClearHeaders();
response.Buffer = true;
response.AddHeader("Content-Disposition", string.Format("Attachment; filename=\"{0}\"", fileName));
response.ContentType = contentType;
response.BinaryWrite(data);
response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();
//response.End();
}
所以我可以看到它获取XML消息,但是当我检查控制台时出现此错误,我收到此错误: http://i.imgur.com/VppKLhG.png
编辑错误:
错误:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器收到的消息。此错误的常见原因是通过调用Response.Write(),响应过滤器,HttpModules或服务器跟踪来修改响应时。
详情:在'附近解析时出错<测试xmlns =" " /> < !d&#39 ;.
在Fiddler中,我可以看到原始XML消息,但是1.)它没有下载,2。)它在XML消息的末尾添加了一大堆废话,这是我的单独程序不这样做。
答案 0 :(得分:0)
在这里回答我自己的问题。 找出问题所在,所以这是我的发现。在这个网站上找到答案: itemcommand to not do async postback
问题是,当您单击GridColumnButton时,Postback阻止它下载。 所以基本上你需要阻止按钮进行回发,你需要设置为
set_enableAJAX(假)
将我在单独答案中修改的内容发布并标记为
答案 1 :(得分:0)
所以这就是我所做的修复
问题在于我的GridButtonColumn
private void DownloadXml()
{
try
{
MemoryStream stream = null;
if (grdMessages.SelectedItems.Count > 0)
{
foreach (GridDataItem item in grdMessages.SelectedItems)
{
int queueId = int.Parse(item["QueueId"].Text);
ibis_GetXmlTextResult result = Client.IbisGetClient(Endpoint).ibis_GetXmlText(queueId);
stream = new MemoryStream();
var r = result.XmlMessage.ToString();
//r = "Hello this is my file:)";
using (StreamWriter writer = new StreamWriter(stream))
{
writer.Write(r);
writer.Flush();
}
WriteToPage(stream.ToArray(), "text/xml; charset=UTF-8", string.Format("{0}_ClientXml.xml", queueId));
}
}
catch (Exception ex)
{
LogException(ex, "Demand Filter", "Well that didn't work. Check for error " + ex.StackTrace);
}
}
这是WriteToPage()
private void WriteToPage(byte[] data, string contentType, string fileName)
{
HttpResponse response = Page.Response;
response.Clear();
response.ClearContent();
response.ClearHeaders();
response.Buffer = true;
response.AddHeader("Content-Disposition", string.Format("Attachment; filename=\"{0}\"", fileName));
response.ContentType = contentType;
response.BinaryWrite(data);
response.Flush();
response.End();
}
在我看来,我必须添加一些东西。为了让我的脚本工作,我必须将它添加到我的RadAjaxManager(注意我正在使用Telerik )
`
<telerik:RadAjaxManager ID="RadAjaxManager1" runat="server" UpdatePanelsRenderMode ="Inline" DefaultLoadingPanelID="AjaxLoadingPanel">
<AjaxSettings>
<telerik:AjaxSetting AjaxControlID="RadGrid1">
<UpdatedControls>
<telerik:AjaxUpdatedControl ControlID="RadGrid1" />
</UpdatedControls>
</telerik:AjaxSetting>
</AjaxSettings>
</telerik:RadAjaxManager>
`
这是我在视图中使用的脚本
`
<telerik:radscriptblock id="RadScriptBlock1" runat="server">
<script type="text/javascript">
function onTabSelecting(sender, args)
{
if (args.get_tab().get_pageViewID())
{
args.get_tab().set_postBack(false);
}
}
function RadGrid1_Command(sender, args)
{
var commandName = args.get_commandName();
if (commandName == "DownloadXml") {
$find("<%= RadAjaxManager1.ClientID %>").set_enableAJAX(false);
}
}
</script>
</telerik:radscriptblock>
`
然后这是该死的马铃薯咬我的屁股。
`protected void grdMessages_ItemCreated(object sender, GridItemEventArgs e)
{
if (e.Item is GridDataItem)
{
GridDataItem item = (GridDataItem)e.Item;
LinkButton btnXML = (LinkButton)item["DownloadXml"].Controls[0];
btnXML.Click += new EventHandler(btnXML_Click);
btnXML.Attributes.Add("OnClick", "DownloadXML(); return false;");
}
}
`
所以我唯一需要的就是“回归假”;在属性。
希望这可以帮助某人在线。我到处寻找这个该死的答案,不得不将一堆垃圾组合起来才能使它发挥作用。 是的,有多种方法可以做到。
Goodluck和Happy Coding 翻转