【问题标题】:What is your prefered way to return XML from an ActionMethod in Asp.net MVC?在 Asp.net MVC 中从 ActionMethod 返回 XML 的首选方式是什么?
【发布时间】:2010-04-07 13:43:24
【问题描述】:

我正在显示异步加载数据的图表,因为搜索是获取数据的工作量很大。数据必须以 XML 格式返回以使图表库满意。
我的 ActionMethods 返回一个 ContentResult,其类型设置为 text/xml。我使用 Linq to XML 构建我的 Xml 并调用 ToString。这很好用,但测试起来并不理想。
我有另一个想法来实现这一点,即返回一个使用 XSLT 视图引擎构建我的 XML 的视图。

我很好奇,我总是尝试以“正确的方式”做事。那么你们是如何处理这种情况的呢?

您是实现不同的 ViewEngine(如 xslt)来构建您的 XML,还是在您的控制器(或为您的控制器提供服务的服务)中构建您的 XML?

编辑:

因为我需要这个来将数据传递到图表库,我必须遵循他们的 xml 结构。他们的符号根本不是我想要构建模型类的方式。这就是我使用 Linq to XML 自己构建 XML 并想知道模板是否会更好的原因。
简单的序列化不是我想要的

【问题讨论】:

标签: .net xml asp.net-mvc


【解决方案1】:

编写自定义操作结果:

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

【讨论】:

  • 既然是将数据传递给图表库,我必须遵循他们的 xml 表示法。这种表示法根本不是我想要构建模型类的方式。这就是我使用 Linq to XML 自己构建 xml 并想知道模板是否会更好的原因。简单的序列化不是我想要的
  • 那么不要使用 XML 序列化程序。在 ExecuteResult 方法中使用任何你想要的东西来将你的模型转换为兼容的 XML。
  • 好的,这将产生一个非常具体的 ActionResult,因为我有不同类型的图表需要不同的 xml 结构。但这仍然更好且可测试。谢谢!
【解决方案2】:

我使用自己的自定义 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);
            }
        }
    }

【讨论】:

    【解决方案3】:

    鉴于您使用 Linq to XML 来编写响应 XML,您可能希望使用与我相同的方法。

    我在 action 方法中创建了一个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);
    }
    

    这个可重复使用的自定义 ActionResultXDocument 序列化为 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 以外的编码,也可以简单地为其添加属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      相关资源
      最近更新 更多