दिलचस्प पोस्ट
Build.scala,% और %% प्रतीक जिसका अर्थ है एकल URL क्वेरी स्ट्रिंग मान बदलें स्विफ्ट में #define मैक्रोज़ के साथ उद्देश्य- C कोड का उपयोग कैसे करें Backbone.js मॉडल डेटा को सहेजने के तरीके? पाठ के अनुसार यूआईएलबल की गतिशील रूप से ऊँचाई बढ़ रही है, आईओएस 7.0 और आईओएस 6.1 के लिए अलग-अलग मूल्य लौटे गणना शक्तियों की गति (अजगर में) चयन सूची में छवियां कैसे जोड़ें बग: एक दिनांक पिक्चर पर दिनांक चुनें जो कि फ्लोटिंग वीएसटीओ ऐड-इन से बाहर हो पीएचपी का इस्तेमाल करते हुए एकल फाइल अपलोड फॉर्म बनाने का सबसे अच्छा तरीका क्या है? आर में डुप्लिकेट मान खोजें PHP में DOMPDF का उपयोग कर पीडीएफ पेज में हैडर Mongoose.js instance.save () कॉलबैक फायरिंग नहीं है अर्रे # प्रत्येक बनाम अर्रे # नक्शा Jquery मोबाइल का उपयोग कर पृष्ठों के बीच पैरामीटर पास करें Maven: प्लगइन प्रबंधन क्या है?

एक्सएमएल को एक्शन रिंग के रूप में एक नियंत्रक की कार्रवाई से वापस लौटाएं?

ASP.NET MVC में नियंत्रक की कार्रवाई से एक्सएमएल को वापस लाने का सबसे अच्छा तरीका क्या है? JSON को वापस करने का एक अच्छा तरीका है, लेकिन XML के लिए नहीं। क्या मुझे सचमुच एक व्यू के माध्यम से एक्सएमएल मार्ग की ज़रूरत है, या मुझे रिस्पांस का सबसे अच्छा अभ्यास तरीका नहीं करना चाहिए.क्या इसे लिखना है?

Solutions Collecting From Web of "एक्सएमएल को एक्शन रिंग के रूप में एक नियंत्रक की कार्रवाई से वापस लौटाएं?"

MVCContrib 's XmlResult एक्शन का उपयोग करें

संदर्भ के लिए उनका कोड है:

public class XmlResult : ActionResult { private object objectToSerialize; /// <summary> /// Initializes a new instance of the <see cref="XmlResult"/> class. /// </summary> /// <param name="objectToSerialize">The object to serialize to XML.</param> public XmlResult(object objectToSerialize) { this.objectToSerialize = objectToSerialize; } /// <summary> /// Gets the object to be serialized to XML. /// </summary> public object ObjectToSerialize { get { return this.objectToSerialize; } } /// <summary> /// Serialises the object that was passed into the constructor to XML and writes the corresponding XML to the result stream. /// </summary> /// <param name="context">The controller context for the current request.</param> public override void ExecuteResult(ControllerContext context) { if (this.objectToSerialize != null) { context.HttpContext.Response.Clear(); var xs = new System.Xml.Serialization.XmlSerializer(this.objectToSerialize.GetType()); context.HttpContext.Response.ContentType = "text/xml"; xs.Serialize(context.HttpContext.Response.Output, this.objectToSerialize); } } } 
 return this.Content(xmlString, "text/xml"); 

यदि आप XML को उत्कृष्ट Linq-to-XML ढांचे का उपयोग करते हुए निर्माण कर रहे हैं, तो यह दृष्टिकोण मददगार होगा।

मैं क्रिया विधि में एक XDocument बना रहा हूँ।

 public ActionResult MyXmlAction() { // Create your own XDocument according to your requirements var xml = new XDocument( new XElement("root", new XAttribute("version", "2.0"), new XElement("child", "Hello World!"))); return new XmlActionResult(xml); } 

यह पुन: प्रयोज्य, कस्टम ActionResult आपके लिए एक्सएमएल धारावाहिक करता है।

 public sealed class XmlActionResult : ActionResult { private readonly XDocument _document; public Formatting Formatting { get; set; } public string MimeType { get; set; } public XmlActionResult(XDocument document) { if (document == null) throw new ArgumentNullException("document"); _document = document; // Default values MimeType = "text/xml"; Formatting = Formatting.None; } public override void ExecuteResult(ControllerContext context) { context.HttpContext.Response.Clear(); context.HttpContext.Response.ContentType = MimeType; using (var writer = new XmlTextWriter(context.HttpContext.Response.OutputStream, Encoding.UTF8) { Formatting = Formatting }) _document.WriteTo(writer); } } 

आप एक माइम प्रकार (जैसे application/rss+xml ) निर्दिष्ट कर सकते हैं और यदि आप की आवश्यकता होती है तो आउटपुट इंडेंट करना चाहिए। दोनों गुणों में समझदार चूक है।

अगर आपको यूटीएफ 8 के अलावा किसी एन्कोडिंग की जरूरत है, तो इसके लिए एक संपत्ति भी जोड़ना सरल है

यदि आप केवल एक अनुरोध के माध्यम से एक्सएमएल वापस करने में रुचि रखते हैं, और आपके पास अपना एक्सएमएल "चक" है, तो आप बस (अपने नियंत्रक में एक कार्यवाही के रूप में) कर सकते हैं:

 public string Xml() { Response.ContentType = "text/xml"; return yourXmlChunk; } 

MVC Contrib में एक XmlResult (और अधिक) है http://www.codeplex.com/MVCContrib पर एक नज़र डालें

अंत में यह काम प्राप्त करने के लिए प्रबंधित करें और सोचा कि मैं दस्तावेज़ को दूसरों को दर्द को बचाने की उम्मीदों में कैसे यहां प्रस्तुत करेगा।

वातावरण

  • VS2012
  • SQL सर्वर 2008R2
  • .NET 4.5
  • ASP.NET MVC4 (रेजर)
  • विंडोज 7

समर्थित वेब ब्राउज़र

  • फ़ायरफ़ॉक्स 23
  • IE 10
  • क्रोम 29
  • ओपेरा 16
  • सफ़ारी 5.1.7 (Windows के लिए पिछले एक?)

मेरा कार्य एक यूआई बटन क्लिक पर था, मेरे नियंत्रक पर एक विधि (कुछ पैरामीटर के साथ) को कॉल करें और फिर इसे एक्सएसएलटी ट्रांस्फ़ॉर्म के जरिए एमएस एक्सेल एक्सएमएल वापस कर दिया है। लौटा एमएस एक्सेल एक्सएमएल तब ब्राउजर को खोलें / सहेजें संवाद पॉपअप करेगा। इसे सभी ब्राउज़रों (ऊपर सूचीबद्ध) में काम करना पड़ा था।

पहले मैंने अजाक्स के साथ और फ़ाइल नाम के लिए "डाउनलोड" विशेषता के साथ एक गतिशील एंकर बनाने की कोशिश की, लेकिन केवल 5 ब्राउज़र (एफएफ, क्रोम, ओपेरा) में से 3 के लिए काम किया और आईई या सफारी के लिए नहीं। और वास्तविक "डाउनलोड" का कारण होने के लिए एंकर के क्लिक ईवेंट को प्रोग्रामेटिक रूप से आग लगाने की कोशिश करने के मुद्दे थे।

मैं क्या कर रहा हूं "अदृश्य" आइफ़राइम का उपयोग कर रहा था और यह सभी 5 ब्राउज़रों के लिए काम किया!

तो यह है कि मैं किसके साथ आया हूं: [कृपया ध्यान दें कि मैं किसी एचटीएमएल / जावास्क्रिप्ट गुरु के द्वारा नहीं हूं और केवल प्रासंगिक कोड को शामिल किया है)

एचटीएमएल (प्रासंगिक बिट्स का स्निपेट)

 <div id="docxOutput"> <iframe id="ifOffice" name="ifOffice" width="0" height="0" hidden="hidden" seamless='seamless' frameBorder="0" scrolling="no"></iframe></div> 

JAVASCRIPT

 //url to call in the controller to get MS-Excel xml var _lnkToControllerExcel = '@Url.Action("ExportToExcel", "Home")'; $("#btExportToExcel").on("click", function (event) { event.preventDefault(); $("#ProgressDialog").show();//like an ajax loader gif //grab the basket as xml var keys = GetMyKeys();//returns delimited list of keys (for selected items from UI) //potential problem - the querystring might be too long?? //2K in IE8 //4096 characters in ASP.Net //parameter key names must match signature of Controller method var qsParams = [ 'keys=' + keys, 'locale=' + '@locale' ].join('&'); //The element with id="ifOffice" var officeFrame = $("#ifOffice")[0]; //construct the url for the iframe var srcUrl = _lnkToControllerExcel + '?' + qsParams; try { if (officeFrame != null) { //Controller method can take up to 4 seconds to return officeFrame.setAttribute("src", srcUrl); } else { alert('ExportToExcel - failed to get reference to the office iframe!'); } } catch (ex) { var errMsg = "ExportToExcel Button Click Handler Error: "; HandleException(ex, errMsg); } finally { //Need a small 3 second ( delay for the generated MS-Excel XML to come down from server) setTimeout(function () { //after the timeout then hide the loader graphic $("#ProgressDialog").hide(); }, 3000); //clean up officeFrame = null; srcUrl = null; qsParams = null; keys = null; } }); 

सी # सर्वर-साइड (कोड स्निपेट) @ ड्रॉ ने एक कस्टम एक्शनरसल्ट बनाया जिसे एक्सएमएलएक्शनआरसल्ट कहा गया है जिसे मैंने अपने उद्देश्य के लिए संशोधित किया था।

एक्सएमएल को एक्शन रिंग के रूप में एक नियंत्रक की कार्रवाई से वापस लौटाएं?

मेरी नियंत्रक विधि (कार्यवाही रिटर्न)

  • एक XML उत्पन्न करने वाले SQL सर्वर संग्रहीत proc के लिए कुंजी पैरामीटर को पास करता है
  • उस एक्सएमएल को एक्सएसएलटी के जरिए एमएस एक्सेल एक्सएमएल (एक्सएमएलडीकास्ट) में बदल दिया जाता है
  • संशोधित XmlActionResult का उदाहरण बनाता है और यह देता है

    XmlActionResult परिणाम = नया XmlActionResult (एक्सेल एक्सएमएल, "एप्लिकेशन / vnd.ms-excel"); स्ट्रिंग संस्करण = दिनांकटाइम.Now.ToString ("dd_MMM_yyy_hhmmsstt"); स्ट्रिंग फ़ाइल मास्क = "LabelExport_ {0} .xml";
    परिणाम। डाउनलोडफ़िल्मेन नाम = स्ट्रिंग। फॉर्मेट (फ़ाइल मास्क, संस्करण); वापसी परिणाम;

XmlActionResult वर्ग के लिए मुख्य संशोधन जो @ ड्र्यू बनाया गया था।

 public override void ExecuteResult(ControllerContext context) { string lastModDate = DateTime.Now.ToString("R"); //Content-Disposition: attachment; filename="<file name.xml>" // must set the Content-Disposition so that the web browser will pop the open/save dialog string disposition = "attachment; " + "filename=\"" + this.DownloadFilename + "\"; "; context.HttpContext.Response.Clear(); context.HttpContext.Response.ClearContent(); context.HttpContext.Response.ClearHeaders(); context.HttpContext.Response.Cookies.Clear(); context.HttpContext.Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);// Stop Caching in IE context.HttpContext.Response.Cache.SetNoStore();// Stop Caching in Firefox context.HttpContext.Response.Cache.SetMaxAge(TimeSpan.Zero); context.HttpContext.Response.CacheControl = "private"; context.HttpContext.Response.Cache.SetLastModified(DateTime.Now.ToUniversalTime()); context.HttpContext.Response.ContentType = this.MimeType; context.HttpContext.Response.Charset = System.Text.UTF8Encoding.UTF8.WebName; //context.HttpContext.Response.Headers.Add("name", "value"); context.HttpContext.Response.Headers.Add("Last-Modified", lastModDate); context.HttpContext.Response.Headers.Add("Pragma", "no-cache"); // HTTP 1.0. context.HttpContext.Response.Headers.Add("Expires", "0"); // Proxies. context.HttpContext.Response.AppendHeader("Content-Disposition", disposition); using (var writer = new XmlTextWriter(context.HttpContext.Response.OutputStream, this.Encoding) { Formatting = this.Formatting }) this.Document.WriteTo(writer); } 

वह मूल रूप से यह था आशा है कि यह दूसरों को मदद करता है

एक सरल विकल्प जो आपको धाराओं का उपयोग करने देता है और जो कि return File(stream, "text/xml");

मुझे हाल ही में एक साइटकोर प्रोजेक्ट के लिए ऐसा करना पड़ा है जो एक साइटकोर आइटम और उसके बच्चों से एक XmlDocument बनाने के लिए एक विधि का उपयोग करता है और एक फ़ाइल के रूप में नियंत्रक ActionResult से इसे वापस देता है। मेरा समाधान:

 public virtual ActionResult ReturnXml() { return File(Encoding.UTF8.GetBytes(GenerateXmlFeed().OuterXml), "text/xml"); } 

यह करने का एक आसान तरीका है:

  var xml = new XDocument( new XElement("root", new XAttribute("version", "2.0"), new XElement("child", "Hello World!"))); MemoryStream ms = new MemoryStream(); xml.Save(ms); return File(new MemoryStream(ms.ToArray()), "text/xml", "HelloWorld.xml"); 

ड्र्यू नोक्स से जवाब का एक छोटा परिवर्तन, जो XDocument की विधि सहेजें () का उपयोग करते हैं।

 public sealed class XmlActionResult : ActionResult { private readonly XDocument _document; public string MimeType { get; set; } public XmlActionResult(XDocument document) { if (document == null) throw new ArgumentNullException("document"); _document = document; // Default values MimeType = "text/xml"; } public override void ExecuteResult(ControllerContext context) { context.HttpContext.Response.Clear(); context.HttpContext.Response.ContentType = MimeType; _document.Save(context.HttpContext.Response.OutputStream) } }