限制控制器返回的数据

时间:2009-02-10 23:04:15

标签: c# asp.net-mvc serialization interface

我需要有关如何从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项目中,我有一个返回客户数据的控制器操作。该项目实际上更像是一个Web服务,因为没有与数据关联的View ...我们使用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 :(得分:0)

你可以尝试这个,但我不确定它是否适用于xml序列化程序:

return new XmlResult(new { customer.Name, customer.State });

答案 1 :(得分:0)

请参阅this related question,建议使用匿名类型。

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

答案 2 :(得分:0)

答案 3 :(得分:0)

我最后只是像同事们建议的那样做XmlIgnore,尽管这给我留下了一些不受欢迎的(或者我认为的)行为。

为了解决XmlIgnore将继续隐藏我可能希望稍后序列化的属性这一事实我asked another question试图找到解决该问题的方法。 Cheeso提出了一个很好的答案,使XmlIgnore成为最佳途径(在我看来)。