Ограничение данных, возвращаемых контроллером - PullRequest
0 голосов
/ 11 февраля 2009

Мне нужен совет о том, как вернуть ограниченный набор данных из контроллера MVC.

Допустим, у меня есть класс, который сконструирован так:

public interface ICustomerExpose
{
   string Name {get; set;}
   string State {get; set;}
}

public interface ICustomer: ICustomerExpose
{
   int Id {get; set;}
   string SSN {get; set;}
}

public class Customer: ICustomer
{
   ...
}

В моем проекте MVC у меня есть действие контроллера, которое возвращает данные клиента. Проект на самом деле больше похож на веб-сервис, так как с данными нет представления, связанного с данными ... мы используем XmlResult (предоставляется проектом MVCContrib ). Действие контроллера выглядит так:

    // GET: /Customer/Show/5
    public ActionResult Show(int id)
    {
        Customer customer = Customer.Load(id);

        ...  // some validation work

        return new XmlResult((ICustomerExpose)customer);
    }

Приведенный выше код контроллера не работает так, как я хочу. Я хочу, чтобы только то, что только свойства Name и State сериализуются и возвращаются в XmlResult. На практике сериализуется весь объект клиента, включая данные, которые я определенно не хочу раскрывать.

Я знаю причину, по которой это не работает: вы не можете сериализовать интерфейс.

Одной из идей, возникших в офисе, было просто пометить свойства Name и State как [XmlIgnore]. Тем не менее, это не кажется хорошим решением для меня. Могут быть и другие случаи, когда я хочу сериализовать эти свойства, и пометка свойств класса таким способом запрещает мне.

Каков наилучший способ достижения моей цели - только сериализации свойств в интерфейсе ICustomerExpose?

Добавление:

Для тех, кто интересуется тем, что делает XmlResult, вот соответствующие части:

 public class XmlResult : ActionResult
 {
     private object _objectToSerialize;
     public XmlResult(object objectToSerialize)
     {
        _objectToSerialize = objectToSerialize;
     }

     /// <summary>
     /// Serialises the object that was passed into the constructor 
     /// to XML and writes the corresponding XML to the result stream.
     /// </summary>
     public override void ExecuteResult(ControllerContext context)
     {
         if (_objectToSerialize != null)
         {
            var xs = new XmlSerializer(_objectToSerialize.GetType());
            context.HttpContext.Response.ContentType = "text/xml";
            xs.Serialize(context.HttpContext.Response.Output, _objectToSerialize);
         }
     }
 }

Ответы [ 4 ]

0 голосов
/ 27 февраля 2009

В итоге я просто выполнил XmlIgnore, как предлагали коллеги, даже несмотря на то, что из-за этого у меня возникло нежелательное (или я так думал) поведение.

Чтобы обойти тот факт, что XmlIgnore будет продолжать скрывать свойства, которые я мог бы захотеть сериализовать позже, я задал еще один вопрос , пытаясь найти способ обойти эту проблему. Cheeso придумал отличный ответ, сделав XmlIgnore лучшим (на мой взгляд) маршрутом.

0 голосов
/ 11 февраля 2009

См. этот связанный вопрос , который рекомендует использовать анонимный тип.

// GET: /Customer/Show/5
public ActionResult Show(int id)
{
    Customer customer = Customer.Load(id);

    ...  // some validation work

    var result = from c in cusomter
                 select new
                 {
                     Name = c.Name,
                     State = c.State,
                 };

    // or just

    var result = new
                 {
                     Name = customer.Name,
                     State = customer.State,
                 };


    return new XmlResult(result);
}
0 голосов
/ 26 февраля 2009

Рассмотрите возможность использования, только для этой одной проблемы, литералов XML в VB9, а не сериализации. Шутки в сторону. Просто дайте ему 20 минут вашего времени. Там много вариантов.

http://www.hanselman.com/blog/TheWeeklySourceCode30VBNETWithXMLLiteralsAsAViewEngineForASPNETMVC.aspx

http://www.hanselman.com/blog/XLINQToXMLSupportInVB9.aspx

http://blogs.msdn.com/dmitryr/archive/2008/12/29/asp-net-mvc-view-engine-using-vb-net-xml-literals.aspx

http://haacked.com/archive/2008/12/29/interesting-use-of-xml-literals-as-a-view-engine.aspx

http://www.infoq.com/news/2009/02/MVC-VB

Для того, что вы делаете, возвращая XML в качестве веб-службы для бедного человека, это сделано специально.

0 голосов
/ 11 февраля 2009

Вы можете попробовать это, однако я не уверен, работает ли он с сериализаторами xml:

return new XmlResult(new { customer.Name, customer.State });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...