Beispiel #1
0
        //trail search form
        public IActionResult Search()
        {
            List <string> states = context.Trails.OrderBy(s => s.State).Select(s => s.State).Distinct().ToList();
            List <City>   cities = context.Cities.OrderBy(c => c.Name).ToList();
            List <DestinationCategory> categories = context.DestinationCategories.ToList();
            SearchTrailViewModel       viewModel  = new SearchTrailViewModel(states, cities, categories);

            if (TempData["emptySearch"] != null)
            {
                ViewBag.error = TempData["emptySearch"].ToString();
            }

            return(View(viewModel));
        }
Beispiel #2
0
        public IActionResult Results(SearchTrailViewModel viewModel, string state)
        {
            List <Trail> allTrails = context.Trails
                                     .Include(t => t.Destinations)
                                     .ToList();
            List <TrailCity> trailCities = context.TrailCity
                                           .Include(t => t.Trail)
                                           .Include(t => t.City).ToList();
            List <Destination> destinations = context.Destinations.ToList();

            List <Trail> selectedTrails = new List <Trail>().ToList();


            //if nothing is entered in search, it redirects back to the search page with error message
            if (string.IsNullOrEmpty(viewModel.Name) && string.IsNullOrEmpty(state) && (viewModel.CityId == 0) &&
                (viewModel.Distance <= 0) && string.IsNullOrEmpty(viewModel.SurfaceType) && (viewModel.FoodDrink == false) && (viewModel.Parks == false) &&
                (viewModel.Shops == false) && (viewModel.Camping == false) && (viewModel.Other == false))
            {
                TempData["emptySearch"] = "You must enter some search criteria.";
                return(Redirect("Search"));
            }
            else
            {
                //name search
                if (viewModel.Name != null)
                {
                    foreach (Trail trail in allTrails)
                    {
                        if (trail.Name.ToLower().Contains(viewModel.Name.ToLower()) && !selectedTrails.Contains(trail))
                        {
                            selectedTrails.Add(trail);
                        }
                    }
                }
                //state search
                if (state != null)
                {
                    if (selectedTrails.Count > 0)
                    {
                        foreach (Trail trail in selectedTrails.ToList())
                        {
                            if (trail.State != state)
                            {
                                selectedTrails.Remove(trail);
                            }
                        }
                    }
                    else if (selectedTrails.Count == 0 && viewModel.Name == null)
                    {
                        foreach (Trail trail in allTrails)
                        {
                            if (trail.State == state && (!selectedTrails.Contains(trail)))
                            {
                                selectedTrails.Add(trail);
                            }
                        }
                    }
                }
                //city search
                if (viewModel.CityId != 0)
                {
                    if (selectedTrails.Count > 0)
                    {
                        foreach (Trail trail in selectedTrails.ToList())
                        {
                            List <int> cities = new List <int>();

                            foreach (TrailCity cityPair in trailCities)
                            {
                                if (cityPair.TrailId == trail.Id)
                                {
                                    cities.Add(cityPair.CityId);
                                }
                            }

                            if (!cities.Contains(viewModel.CityId))
                            {
                                selectedTrails.Remove(trail);
                            }
                        }
                    }
                    else if (selectedTrails.Count == 0 && viewModel.Name == null && state == null)
                    {
                        foreach (Trail trail in allTrails)
                        {
                            foreach (TrailCity cityPair in trailCities)
                            {
                                if (cityPair.TrailId == trail.Id && cityPair.CityId == viewModel.CityId)
                                {
                                    selectedTrails.Add(trail);
                                }
                            }
                        }
                    }
                }
                //distance search
                if (viewModel.Distance > 0)
                {
                    if (selectedTrails.Count > 0)
                    {
                        foreach (Trail trail in selectedTrails.ToList())
                        {
                            if (trail.Distance <= viewModel.Distance)
                            {
                                selectedTrails.Remove(trail);
                            }
                        }
                    }
                    else if (selectedTrails.Count == 0 && viewModel.Name == null && state == null && viewModel.City == null)
                    {
                        foreach (Trail trail in allTrails)
                        {
                            if (trail.Distance >= viewModel.Distance)
                            {
                                selectedTrails.Add(trail);
                            }
                        }
                    }
                }
                //surface type search
                if (viewModel.SurfaceType != null)
                {
                    if (selectedTrails.Count > 0)
                    {
                        foreach (Trail trail in selectedTrails.ToList())
                        {
                            if (!trail.SurfaceType.Contains(viewModel.SurfaceType))
                            {
                                selectedTrails.Remove(trail);
                            }
                        }
                    }
                    else if (selectedTrails.Count == 0 && viewModel.Name == null && state == null && viewModel.City == null && viewModel.Distance == 0)
                    {
                        foreach (Trail trail in allTrails)
                        {
                            if (trail.SurfaceType.Contains(viewModel.SurfaceType))
                            {
                                selectedTrails.Add(trail);
                            }
                        }
                    }
                }
                //destination category search
                List <int> categories = new List <int>();

                if (viewModel.FoodDrink == true)
                {
                    categories.Add(1);
                }
                if (viewModel.Parks == true)
                {
                    categories.Add(2);
                }
                if (viewModel.Shops == true)
                {
                    categories.Add(3);
                }
                if (viewModel.Camping == true)
                {
                    categories.Add(4);
                }
                if (viewModel.Other == true)
                {
                    categories.Add(5);
                }

                if (categories.Count > 0)
                {
                    if (selectedTrails.Count > 0)
                    {
                        foreach (Trail trail in selectedTrails.ToList())
                        {
                            List <int> cats = new List <int>();
                            foreach (Destination d in destinations)
                            {
                                if (trail.Id == d.TrailId && !cats.Contains(d.CategoryId))
                                {
                                    cats.Add(d.CategoryId);
                                }
                            } // if trail destination categories list(cats) doesn't contain categories checked(categories), remove trail
                            if (!categories.All(i => cats.Contains(i)))
                            {
                                selectedTrails.Remove(trail);
                            }
                        }
                    }
                    else if (selectedTrails.Count == 0 && viewModel.Name == null && state == null && viewModel.City == null && viewModel.Distance == 0 && viewModel.SurfaceType == null)
                    {
                        foreach (Trail trail in allTrails)
                        {
                            List <int> cats = new List <int>();

                            foreach (Destination d in destinations)
                            {
                                if (trail.Id == d.TrailId && !cats.Contains(d.CategoryId))
                                {
                                    cats.Add(d.CategoryId);
                                }
                            }
                            // if trail destination categories contain categories checked, add trail
                            if (categories.All(i => cats.Contains(i)))
                            {
                                selectedTrails.Add(trail);
                            }
                        }
                    }
                }
            }


            List <Trail>     selectedTrailsAsc = selectedTrails.OrderBy(t => t.Name).ToList();
            List <TrailCity> trailCitiesAsc    = trailCities.OrderBy(c => c.City.Name).ToList();

            SearchResultsViewModel results = new SearchResultsViewModel(selectedTrailsAsc, trailCitiesAsc);

            return(View(results));
        }