CODE-ASPX接收jQuery.ajax傳送XML文件範例
5 |
今天應用到以jQuery.ajax送出XML文件,以ASPX接收處理的寫法。在倉庫挖了好久,才找出不久前剛寫過的程式碼參考。為了避免中年記憶衰退成為我活到老,Coding到老路上的絆腳石,整理一下程式貼成KB,也順便與有此需求的鄉親們分享。
HttpRequest要傳遞整份XML文件時,並不是將XML字串放在參數中,而是把整個XML內容當成POST Request的主體,因此在jQuery端與ASPX端跟一般呼叫寫法有些不同。
傳送時,必須直接使用jQuery.ajax()以精確調控參數,沒法用$.post()偷懶。參數中conteType: "text/xml"用來向Web Server表明內容物為XML,processData: false則是要求jQuery將data內容原汁原味上傳,不要做任何解析或修改。
而在ASPX端,不是用Request[".."]接參數,而是要用Request.InputStream接入上傳內容。我在程式串同時列出2.0 XmlDocument及3.5 XDocument的做法比較,3.5明顯簡潔許多。
程式碼如下,有興趣的人就拿回去玩吧!
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Xml" %>
<%@ Import Namespace="System.Xml.Linq" %>
<%@ Import Namespace="System.IO" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void Page_Load(object sender, EventArgs e)
{
if (Request["mode"] == "send")
{
try
{
//LINQ way
XDocument xd =
XDocument.Load(new StreamReader(Request.InputStream));
xd.Root.Add(new XElement("Mark", "Inserted by ASP.NET 3.5"));
Response.Write(xd.ToString());
/* Traditional Way
XmlDocument xd2 = new XmlDocument();
xd2.Load(Request.InputStream);
XmlElement xe = xd2.CreateElement("Mark");
xe.InnerText = "Inserted by ASP.NET 2.0";
xd2.DocumentElement.AppendChild(xe);
Response.Write(xd2.OuterXml);
*/
Response.ContentType = "text/xml";
}
catch (Exception ex)
{
//return text, raise $.ajax error event
Response.ContentType = "text/plain";
Response.Write(ex.Message);
}
Response.End();
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>jQuery Post XML Sample</title>
<script src="js/jquery-1.3.2.js" type="text/javascript"></script>
<script type="text/javascript">
function postXml(url, xmlSrc, callback) {
var xmlString =
jQuery.isXMLDoc(xmlSrc) ?
xmlSrc.xml || (new XMLSerializer()).serializeToString(xmlSrc) :
xmlSrc;
$.ajax({
url: url,
contentType: "text/xml",
data: xmlString,
dataType: "xml",
success: function(x) { callback(x); },
error: function(xhr, textStatus, thrownError) {
alert("Error:" + xhr.responseText); },
processData: false,
type: "POST"
});
}
$(function() {
$("#btnSend").click(function() {
postXml("AjaxPostXmlSample.aspx?mode=send",
$("#taXml").val(), function(xd) {
alert(xd.xml ||
(new XMLSerializer()).serializeToString(xd));
});
});
});
</script>
</head>
<body>
<textarea id="taXml" cols="40" rows="5"><Books>
<Book Title="The Art of Trouble-Shooting" Author="Darkthread" />
</Books></textarea>
<input type="button" id="btnSend" value="Send" />
</body>
</html>
Comments
# by 91
一邊拜 一邊收下了 :)
# by chicken
提供兩個不相甘的 tips .. :P 1. 如果只是單純的接到 request, 要傳 xml 回去... 我都慣用 .ashx, 不用 .aspx ... 因為 System.Web.Page 比 IHttpHandler 多包了一堆東西,效能有差... 2. XmlDocument 抓出 XML 再 write, XML 檔太大或結構複雜時也會有效能問題... 我會反過來,把 XML 的內容儲存到 Response 裡... Response.Write(xd2.OuterXml); 這行改成: xd2.Save(Response.Output);
# by Jeffrey
to chicken, 您的Tips我收下了,感恩~~~
# by Ark
獻醜 程式的文章貼fb還真難看 http://www.facebook.com/profile.php?id=100000042888921&ref=profile#/note.php?note_id=109712408787 內容是MVC架構下的 jquery+ajax+json 用Controller來吞吐server & client的互動~連aspx,ashx都不必 agreements型別class也可以自定 還有StreamReader 有Dispose() 的棉角 一般~習慣~會記得用 using(){}包起來再玩弄他
# by Jeffrey
to Ark, using關鍵字強制Dispose的做法主要用來解決unmanaged resource資源釋放的問題,當牽涉資源為.NET記憶體物件時的風險不高(如果我的理解沒有錯的話)。不過一律加using是有病治病,沒病強身的良好習慣,謝謝提醒。