我正在尝试使用MVC 5应用程序中的api 2控制器将对象返回给ajax请求。我的控制器看起来像这样:
public class RFQsController : ApiController
{
private ApplicationDBContext db = new ApplicationDBContext();
[HttpGet]
public Models.RFQChecklist.RFQ GetRFQByQuote(string number)
{
var quote = db.QuoteSet.FirstOrDefault(q => q.Number == number);
if(quote != null)
{
return quote.RFQ?.FirstOrDefault();
}
else
{
return null;
}
}
}
RFQ看起来像这样:
public class RFQ
{
public int ID { get; set; }
public int QuoteID { get; set; }
//other values
[XmlIgnore, JsonIgnore]
public virtual Quote.Quote Quote { get; set; }
public virtual ICollection<RFQ_Signoff> Signoffs { get; set; }
}
忽略Quote至关重要,因为Quote引用了其包含的询价,因此这将是循环引用。因此,当序列化用于消耗的询价时,我试图忽略Quote,因为Quote必须引用RFQ。问题是XmlIgnore不是...忽略。我也尝试过ScriptIgnore
和DataContract
/ DataMember
的组合。无论我做什么,MVC 5序列化程序似乎都会尝试(失败)再次序列化Quote
对象。
我非常确定这是因为这个值,因为如果删除JsonIgnore
,那么当我尝试以Json的身份进行检索时它将不起作用,但是如果包含它,它将起作用。
答案 0 :(得分:0)
如果要限制返回数据,则需要使用linq select
而不是[XmlIgnore, JsonIgnore]
属性。
您可以尝试使用匿名对象包含期望的返回字段。
return quote.RFQ?.Select(x => new {
ID = x.ID,
QuoteID = x.QuoteID,
Signoffs = x.Signoffs }).FirstOrDefault();
代替
return quote.RFQ?.FirstOrDefault();
尝试返回IHttpActionResult
[HttpGet]
public IHttpActionResult GetRFQByQuote(string number)
{
var quote = db.QuoteSet.FirstOrDefault(q => q.Number == number);
if(quote != null)
{
var result = quote.RFQ?.Select(x => new {
ID = x.ID,
QuoteID = x.QuoteID,
Signoffs = x.Signoffs }).FirstOrDefault()
return Ok(result);
}
else
{
return null;
}
}