代码之家  ›  专栏  ›  技术社区  ›  Stéphane

在ASP.NET MVC中,从actionMethod返回XML的首选方法是什么?

  •  2
  • Stéphane  · 技术社区  · 15 年前

    我正在显示异步加载数据的图表,因为搜索是获取数据的工作非常繁重。数据必须以XML形式返回,以使图表库满意。
    我的actionMethods返回一个ContentResult,其类型设置为text/xml。我使用linq-to-xml构建XML并调用toString。这很好,但不适合测试。
    我还有一个实现这一点的想法,那就是返回一个使用XSLT视图引擎构建XML的视图。

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

    您是实现不同的视图引擎(如XSLT)来构建XML,还是在控制器(或为控制器服务的服务)内构建XML?

    编辑:

    因为我需要这个把数据传送到图表库, 我必须遵循它们的XML结构 . 他们的符号根本不是我想要构建模型类的方式。这就是为什么我自己用linq-to-xml构建XML,并想知道模板是否更好。
    简单的序列化不是我想要的

    3 回复  |  直到 12 年前
        1
  •  5
  •   Darin Dimitrov    15 年前

    编写自定义操作结果:

    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);
    }
    
        2
  •  1
  •   dove    15 年前

    我使用我自己的自定义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
  •  0
  •   Drew Noakes    12 年前

    考虑到您正在使用LINQtoXML来组成响应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 序列化 X文档 作为响应流的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以外的编码,那么也可以为它添加一个属性。