繁体   English   中英

从Asp.net MVC中的ActionMethod返回XML的首选方式是什么?

[英]What is your prefered way to return XML from an ActionMethod in Asp.net MVC?

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

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

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

编辑:

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

编写自定义操作结果:

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

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

假设您使用的是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);
}

此可重用的自定义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以外的编码,那么也可以为此添加一个属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM