2010-04-07 82 views
2

我正在顯示異步加載數據的圖表,因爲搜索是用於提取數據的工作量非常大。數據必須作爲XML返回,以使圖表庫變得快樂。
我的ActionMethods返回一個類型設置爲text/xml的ContentResult。我使用Linq to XML構建我的Xml並調用ToString。這工作正常,但它不是理想的測試。
我有另一個想法來實現這將返回一個視圖,使用XSLT視圖引擎構建我的XML。什麼是你最喜歡的方式來從Asp.net MVC的ActionMethod返回XML?

我很好奇,我總是試圖做「正確的方式」的事情。那麼你們如何處理這種情況?

您是否實現了一個不同的ViewEngine(如xslt)來構建您的XML,或者您是否在控制器(或服務於您的控制器的服務)中構建XML?

編輯:

因爲我需要這個數據傳遞到圖表庫,我必須按照他們的XML結構。他們的符號不是我想要建立我的模型類的方式。這就是爲什麼我使用Linq to XML自己構建XML,並想知道模板會更好。
簡單的序列是不是我找

+0

可能的[在ASP.NET MVC中從控制器的動作返回XML的最佳方式是什麼?](http://stackoverflow.com/questions/134905/what-is-the-best-way-to -return-xml-a-controllers-action-in-asp-net-mvc) – 2012-10-04 08:22:52

回答

5

編寫自定義操作結果:

public class XmlActionResult : ActionResult 
{ 
    public XmlActionResult(object data) 
    { 
     Data = data; 
    } 

    public object Data { get; private set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     context.HttpContext.Response.ContentType = "text/xml"; 

     // TODO: Use your preferred xml serializer 
     // to serialize the model to the response stream : 
     // context.HttpContext.Response.OutputStream 
    } 
} 

而在你的控制器動作:

public ActionResult Index() 
{ 
    var model = _repository.GetModel(); 
    return new XmlActionResult(model); 
} 
+0

由於是將數據傳遞給圖表庫,所以我必須遵循它們的xml表示法。這種表示法並不是我想要構建我的模型類的方式。這就是爲什麼我使用Linq to XML自己構建xml,並想知道模板會更好。簡單的序列化不是我所尋找的 – 2010-04-07 13:54:50

+0

那麼不要使用XML串化器。使用任何您想要的方式將模型轉換爲ExecuteResult方法中的兼容XML。 – 2010-04-07 13:58:26

+0

好吧,這將做出非常具體的ActionResult,因爲我有不同類型的圖需要不同的xml結構。但是,這仍然更好,可測試。謝謝! – 2010-04-07 14:25:03

1

我用我自己的自定義的ActionResult,這你可以修改你的需求。

public class XmlDataResult : ActionResult 
    { 
     private readonly object _stringToConvertToXml; 

     public XmlDataResult(string stringToConvertToXml) 
     { 
      _stringToConvertToXml = stringToConvertToXml; 
     } 

     public object StringToConvertToXml 
     { 
      get { return _stringToConvertToXml; } 
     } 

     public override void ExecuteResult(ControllerContext context) 
     { 
      if (_stringToConvertToXml != null) 
      { 
       context.HttpContext.Response.Clear(); 
       context.HttpContext.Response.ContentType = "text/xml"; 
       context.HttpContext.Response.Write(_stringToConvertToXml); 
      } 
     } 
    } 
0

鑑於您使用Linq to XML來編寫響應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的串行化作爲XDocument XML文本爲您的響應流。

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); 
    } 
} 

您可以指定一個MIME類型(如application/rss+xml)以及輸出是否應縮進,如果你需要。這兩個屬性都有明智的默認值。

如果您需要UTF8以外的編碼,那麼添加屬性也很簡單。

相關問題