Мне нужен совет о том, как вернуть ограниченный набор данных из контроллера 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);
}
}
}