Фильтрация поиска с использованием нескольких раскрывающихся списков в MVC дает нулевую модель - PullRequest
2 голосов
/ 27 апреля 2020

В настоящее время я создаю приложение MVC и пытаюсь отобразить список автомобилей на основе выбранного раскрывающегося списка. Я не хочу, чтобы пользователь выбирал несколько раскрывающихся списков для поиска, я хочу, чтобы код мог выполнять поиск по любой комбинации раскрывающихся списков. Я начал писать код с помощью операторов If else, но я не думал, что это лучший метод, поэтому я провел небольшое исследование и нашел другой способ фильтрации своих результатов. У меня проблема в том, что я получаю нулевое значение в модели.

Это моя модель

    public partial class Car 
{

    private Ignition_Hub_DBEntities Context;

    public IQueryable<Car> GetProducts(Car searchModel)
    {
        var result = Context.Cars.AsQueryable();
        if (searchModel != null)
        {
            if (searchModel.CarLotID.HasValue)
                result = result.Where(x => x.CarLotID == searchModel.CarLotID);
            if (searchModel.Available.HasValue)
                result = result.Where(x => x.Available == searchModel.Available);
            if (searchModel.ModelID.HasValue)
                result = result.Where(x => x.ModelID == searchModel.ModelID);
             if (searchModel.Model.MakeID.HasValue)
                return result;
            result = result.Where(x => x.Model.MakeID == searchModel.Model.MakeID);
            return result;
        }
        return result;
    }
        public Car()
    {
        Context = new Ignition_Hub_DBEntities();

    }
    public int? CarID { get; set; }
    public string Year { get; set; }

    public string Notes { get; set; }
    public bool? Available { get; set; }
    public string VinNumber { get; set; }
    public int? CarLotID { get; set; }
    public int? ModelID { get; set; }

    public virtual Model Model { get; set; }
    public virtual CarLot CarLot { get; set; }
}

Это мой контроллер

        public ActionResult DisplaySearchResults(Car searchModel)
    {

        var business = new Car();
        var model = business.GetProducts(searchModel);
        return PartialView("_Index", model);
}

Прямо сейчас я получаю ошибку на if (searchModel.Model.MakeID.HasValue) ошибка 'Object reference not set to an instance of an object.' Спасибо в заранее за помощь! Если есть лучший способ добиться этого, пожалуйста, сообщите. Спасибо!

1 Ответ

1 голос
/ 28 апреля 2020

Необходимо убедиться, что свойство Model модели поиска не равно нулю и передано действию, тогда при поиске необходимо убедиться, что свойство Model элемента в запросе linq не равно нулю, затем сравните свойство MakeID модели поиска со свойством MakeID элемента в запросе linq. Например, если вы собираетесь искать по MakeID из Model, если он указан, вам нужно изменить код на следующий:

if (searchModel.Model !=null && searchModel.Model.MakeID.HasValue)
    result = result.Where(x => x.Model !=null && 
        x.Model.MakeID == searchModel.Model.MakeID);

Однако, если вы следуете этот пост , в общем, лучше следовать этим советам:

  • Не используйте модель Entity в качестве модели поиска POCO.
  • Не размещайте бизнес-логи c в вашем классе POCO.
  • Если вы собираетесь выполнять поиск по MakeID, включите его непосредственно в модель поиска POCO.

Пример

Я расширю пример из связанного поста, так что Product также имеет свойство Category, и мы заинтересованы в поиске на основе CategoryName, а также некоторых других свойств:

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public int Price { get; set; }
    public string Name { get; set; }
    public int CategoryId { get; set; }
    public Category Category { get; set; }
}

Вы можете создать класс ProductSearchModel и поместить на его основе несколько полей, которые вы хотите найти:

public class ProductSearchModel
{
    public int? Id { get; set; }
    public int? PriceFrom { get; set; }
    public int? PriceTo { get; set; }
    public string Name { get; set; }
    public string CategoryName { get; set; }
}

Затем вы можете поместить свою логику поиска c в ProductBusinessLogic класс таким образом :

public class ProductBusinessLogic
{
    private YourDbContext Context;
    public ProductBusinessLogic()
    {
        Context = new YourDbContext();
    }

    public IQueryable<Product> GetProducts(ProductSearchModel searchModel)
    {
        var result = Context.Products.AsQueryable();
        if (searchModel != null)
        {
            if (searchModel.Id.HasValue)
                result = result.Where(x => x.Id == searchModel.Id);
            if (!string.IsNullOrEmpty(searchModel.Name))
                result = result.Where(x => x.Name.Contains(searchModel.Name));
            if (searchModel.PriceFrom.HasValue)
                result = result.Where(x => x.Price >= searchModel.PriceFrom);
            if (searchModel.PriceTo.HasValue)
                result = result.Where(x => x.Price <= searchModel.PriceTo);
            if (!string.IsNullOrEmpty(searchModel.CategoryName))
                result = result.Where(x => x.Category !=null && 
                    x.Category.Name.Contains(searchModel.Name));
        }
        return result;     
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...