XmlIgnore不忽略

时间:2018-08-28 20:41:17

标签: c# asp.net-mvc

我正在尝试使用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不是...忽略。我也尝试过ScriptIgnoreDataContract / DataMember的组合。无论我做什么,MVC 5序列化程序似乎都会尝试(失败)再次序列化Quote对象。 我非常确定这是因为这个值,因为如果删除JsonIgnore,那么当我尝试以Json的身份进行检索时它将不起作用,但是如果包含它,它将起作用。

1 个答案:

答案 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;
    }
}