сложный объект не передается полностью в вызов API (Angular + net core 3) - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь отправить клиенту angular сложный объект. Класс объекта выглядит следующим образом:

public class ProductListModel
{
    public int TotPages { get; set; } = 1;
    public int CurPage { get; set; } = 1;
    public long CatId { get; set; } = -1;

    public string Search { get; set; } = "";
    public string Title = "";
    public Category[] Categories;
    public Product[] Products;
    public bool HasCarousel { get; set; }
    public bool Discounted { get; set; } = false;
}

Я определил интерфейс в angular так же, как и класс:

 interface ProductListModel {
  totPages: number;
  curPage: number;
  catId: number;
  search: string;
  title: string;
  hasCarousel: boolean;
  discounted: boolean;
  categories: Category[];
  products: Product[];
}

Тогда у меня в контроллере API:

 [HttpGet]
     [Route(nameof(GetProducts))]
     public ProductListModel GetProducts(int curPage = 1, long catId= -1, bool discounted = false, string search="")
     {
        // uSession.LastUserUrl = Request.PathBase + Request.Path + Request.QueryString;
        var plm = new ProductListModel();
        int prodPerPage = 10;

        IQueryable<Product> qp;
        if (search != "")
        {
            plm.Title = "Found Products";
            qp = dbContext.Products.Where(p => p.Active && p.Name.Contains(search)).OrderBy(p => p.Name);
        }
        else
        if(discounted)
        {
            plm.Title = "Discounted Products";
            qp = dbContext.Products.Where(p => p.Active && p.DiscountPerc>0).OrderBy(p => p.Name);
        }
        else
        {
            long catIdNone = dbContext.Categories.Where(c => c.Name == "_None").FirstOrDefault().Id;
            if (catId == -1 || catId == catIdNone)
            {
                plm.Title = "All Products";
                qp = dbContext.Products.Where(p => p.Active).OrderBy(p => p.Name);
            }
            else
            {
                var catName = dbContext.Categories.Where(c => c.Id == catId).FirstOrDefault().Name;
                plm.Title = "Category: " + catName;
                qp = dbContext.Products.Where(p => p.Active).Where(p => p.CategoryId == catId).OrderBy(p => p.Name);
            }
        }

        int totPages = (int)Math.Ceiling((decimal)qp.Count() / prodPerPage);

        if (qp!=null)
        {
            plm.Products = qp.Skip((curPage - 1) * prodPerPage).Take(prodPerPage).ToArray();
        }
        var catl = dbContext.Categories.OrderBy(c => c.Name).ToArray();
        if (catl!=null)
        {
            plm.Categories = catl;
        }
        plm.CatId = catId;
        plm.CurPage = curPage;
        plm.TotPages = totPages;
        plm.HasCarousel = (catId == -1) && (!discounted);
        plm.Discounted = discounted;
        plm.Search = search;

        return plm;
     }

И, наконец, вызов angular:

http.get<ProductListModel>(baseUrl + 'api/ajax/GetProducts').subscribe(result => {
  this.ProductListModel = result;
  console.log(result);
}, error => console.error(error));

, но я получаю только свойства, не являющиеся массивами, продукты и категории массивов даже не присутствуют в результате. В Почтальоне я получаю тот же результат, см. Скриншот. Почему это происходит и какое решение вы предлагаете. Спасибо screenshot of postman

1 Ответ

0 голосов
/ 04 апреля 2020

Я обнаружил, что отсутствующие свойства имеют не геттер, а сеттер. Добавление этого решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...