使用来自数据库的 StreamWriter 创建 XML 文档
Creating XML Document with StreamWriter from DB
所以我被要求可以选择从数据库中 download/create 一个 XML 文件。 table 包含一个包含原始 XML 消息的列。用户需要能够保存 XML 文档以供查看。
所以我在一个单独的程序中测试了我的下载,它可以正常工作,完美地下载和创建 XML Doc,但由于某些原因它不会 download/create 在实际程序中。
所以我创建了一个存储过程来调用 XML Message = 到 QueueId。
按钮位于数据网格中(我们使用的是 Telerik)
所以我正在使用 MemoryStream 和流编写器将 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 或启用服务器跟踪来修改响应。
详细信息:在“ < !D' 附近解析时出错。
在 Fiddler 中我可以看到原始的 XML 消息,但是 1.) 它没有下载,2.) 它在我的 XML 消息的末尾添加了一大堆废话单独的程序不行。
在这里回答我自己的问题。
弄清楚问题是什么,所以这是我的发现。在这个网站上找到答案:
itemcommand to not do async postback
问题是,当您单击 GridColumnButton 时,回发阻止了它的下载。
所以基本上你需要防止按钮做 postback 并且你需要设置为
set_enableAJAX(假)
将 post 我在单独的答案中修复的内容并标记那个
所以这是我修复它的方法
问题出在我的 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;");
}
}
`
所以我唯一需要的就是属性中的 "return false;"。
希望这对在线某个地方的人有所帮助。我到处寻找该死的答案,不得不结合一堆废话才能让它发挥作用。
是的,有多种方法可以做到这一点。
祝你编程愉快
翻转 - OUT
所以我被要求可以选择从数据库中 download/create 一个 XML 文件。 table 包含一个包含原始 XML 消息的列。用户需要能够保存 XML 文档以供查看。
所以我在一个单独的程序中测试了我的下载,它可以正常工作,完美地下载和创建 XML Doc,但由于某些原因它不会 download/create 在实际程序中。
所以我创建了一个存储过程来调用 XML Message = 到 QueueId。
按钮位于数据网格中(我们使用的是 Telerik)
所以我正在使用 MemoryStream 和流编写器将 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 或启用服务器跟踪来修改响应。
详细信息:在“
在 Fiddler 中我可以看到原始的 XML 消息,但是 1.) 它没有下载,2.) 它在我的 XML 消息的末尾添加了一大堆废话单独的程序不行。
在这里回答我自己的问题。 弄清楚问题是什么,所以这是我的发现。在这个网站上找到答案: itemcommand to not do async postback
问题是,当您单击 GridColumnButton 时,回发阻止了它的下载。 所以基本上你需要防止按钮做 postback 并且你需要设置为
set_enableAJAX(假)
将 post 我在单独的答案中修复的内容并标记那个
所以这是我修复它的方法
问题出在我的 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;");
}
}
`
所以我唯一需要的就是属性中的 "return false;"。
希望这对在线某个地方的人有所帮助。我到处寻找该死的答案,不得不结合一堆废话才能让它发挥作用。 是的,有多种方法可以做到这一点。
祝你编程愉快 翻转 - OUT