我需要有关如何从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);
}
}
}
答案 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)
考虑使用VB9中的XML文字而不是序列化,仅针对这一问题。认真。请给它20分钟的时间。有很多选择。
http://www.hanselman.com/blog/XLINQToXMLSupportInVB9.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作为穷人的Web服务返回,这是量身定制的。
答案 3 :(得分:0)
我最后只是像同事们建议的那样做XmlIgnore,尽管这给我留下了一些不受欢迎的(或者我认为的)行为。
为了解决XmlIgnore将继续隐藏我可能希望稍后序列化的属性这一事实我asked another question试图找到解决该问题的方法。 Cheeso提出了一个很好的答案,使XmlIgnore成为最佳途径(在我看来)。