Как иметь «служебные» страницы в ASP.NET MVC? - PullRequest
1 голос
/ 27 января 2011

MVC новичок здесь:

Я более или менее проработал аспект навигации по страницам MVC.Но допустим, я не хочу переходить к представлению, а хочу получить ответ с веб-сайта, например, отправив запрос на http://mysite.com/Services/GetFoo/123 Я хочу сделать запрос базы данных, чтобы выбратьFoo объект с идентификатором 123 и возвращение его сериализованным в XML.

Как вы это сделаете?

Ответы [ 4 ]

7 голосов
/ 27 января 2011

Я бы написал результат произвольного действия:

public class XmlResult : ActionResult
{
    private readonly object _data;
    public XmlResult(object data)
    {
        if (data == null)
        {
            throw new ArgumentNullException("data");
        }
        _data = data;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        // You could use any XML serializer that fits your needs
        // In this example I use XmlSerializer
        var serializer = new XmlSerializer(_data.GetType());
        var response = context.HttpContext.Response;
        response.ContentType = "text/xml";
        serializer.Serialize(response.OutputStream, _data);
    }
}

и затем в моем контроллере:

public ActionResult GetFoo(int id)
{
    FooModel foo = _repository.GetFoo(id);
    return new XmlResult(foo);
}

И если это return new XmlResult(foo); кажется вам ужасным, вы можете использовать метод расширения:

public static class ControllersExtension
{
    public static ActionResult Xml(this ControllerBase controller, object data)
    {
        return new XmlResult(data);
    }
}

и затем:

public ActionResult GetFoo(int id)
{
    FooModel foo = _repository.GetFoo(id);
    return this.Xml(foo);
}
1 голос
/ 27 января 2011

Если бы вы могли жить с результатом JSON, должно работать следующее:

public class ServicesController : Controller
{
    public ActionResult GetFoo(int id)
    {
        var dbResult = SomeDbUtil.GetFoo(id);
        return this.Json(dbResult);
    }
}

Это даст вам довольно простой результат запроса JSON. Однако, если вы хотите, чтобы ваши сервисы были доступными для обнаружения SOAP XML и т. Д., Мне кажется, что лучше создать другой проект / веб-сайт, который будет выполнять функцию веб-сервиса.

1 голос
/ 27 января 2011

Возможно, вы найдете ответ на свой вопрос здесь:

См. Возврат XML из действия контроллера в качестве ActionResult?

1 голос
/ 27 января 2011

Похоже, вы хотите создать REST API.

Взгляните на Сиеста , которая сделает всю тяжелую работу.

В качестве альтернативы вы можете написать метод действия, который возвращает представление, которое отображается как XML, а не как HTML.

Что-то вроде:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<MyModel>" ContentType="text/xml" %>
<%= SerializationHelper.SerializeAsXml(Model) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...