Какой ваш предпочтительный способ вернуть XML из ActionMethod в Asp.net MVC? - PullRequest
2 голосов
/ 07 апреля 2010

Я отображаю диаграммы, которые загружают данные асинхронно, потому что поиск - это работа по извлечению данных, довольно тяжелая. Данные должны быть возвращены в виде XML, чтобы радовать библиотеку диаграмм.
Мои ActionMethods возвращают ContentResult с типом, заданным как text / xml. Я строю свой XML с использованием Linq to XML и вызываю ToString. Это отлично работает, но не идеально для тестирования.
У меня есть еще одна идея для достижения этой цели, которая заключается в возвращении представления, которое создает мой XML с использованием механизма представления XSLT.

Мне любопытно, и я всегда стараюсь делать вещи "правильным образом". Так как вы, ребята, справляетесь с такими сценариями?

Реализуете ли вы другой ViewEngine (например, xslt) для создания вашего XML, или вы создаете свой XML внутри своего контроллера (или службы, которая обслуживает ваш контроллер)?

РЕДАКТИРОВАТЬ:

Поскольку это необходимо для передачи данных в библиотеку диаграмм, Я должен следовать их структуре XML . Их нотация - это совсем не то, как я хочу строить свои модельные классы. Вот почему я сам строю XML, используя Linq to XML, и думаю, что шаблон будет лучше.
Простая сериализация - это не то, что я ищу

Ответы [ 3 ]

5 голосов
/ 07 апреля 2010

Написать результат пользовательского действия:

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);
}
1 голос
/ 07 апреля 2010

Я использую свой собственный 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 голосов
/ 04 октября 2012

Учитывая, что вы используете 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, то для этого просто добавить свойство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...