XmlIgnore не игнорировать - PullRequest
       4

XmlIgnore не игнорировать

0 голосов
/ 28 августа 2018

Я пытаюсь вернуть объект в запрос ajax с контроллером api 2 в приложении MVC 5. мой контроллер выглядит так:

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

Запрос предложений выглядит следующим образом:

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 содержит ссылку на содержащиеся в ней запросы, так что это будет циклическая ссылка. Поэтому при сериализации RFQ для потребления я пытаюсь игнорировать Quote, потому что Quote должен ссылаться на RFQ. Проблема в том, что XmlIgnore не ... игнорирует. Я также попробовал ScriptIgnore и комбинацию DataContract / DataMember. Независимо от того, что я делаю, сериализатор MVC 5, кажется, пытается (и не может) сериализовать объект Quote снова. Я вполне уверен, что это из-за этого значения, потому что, если я удаляю JsonIgnore, тогда он не работает, когда я пытаюсь получить как Json, но если я включаю его, это работает.

1 Ответ

0 голосов
/ 28 августа 2018

Если вы хотите ограничить возвращаемые данные, вам нужно использовать 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...