コード例 #1
0
        void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
        {
#if DEBUG
            var profiler = MiniProfiler.Current;
            using (profiler.Step("url correct"))
            {
#endif
            // base
            OnActionExecuting(filterContext);

            string searchString = null;
            // Append searchString to url
            if (filterContext.ActionParameters.ContainsKey("searchString"))
            {
                searchString = (string)filterContext.ActionParameters["searchString"] ?? null;
                if (searchString != null)
                {
                    filterContext.ActionParameters["searchString"] = (string)GetSearchString(searchString);
                }
            }

            // redirect check .. Read and delete temp value
            if (filterContext.Controller.TempData["wasRedirected"] != null)
            {
                filterContext.Controller.TempData["wasRedirected"] = null; return;
            }
            // Get parameters
            var parameters     = filterContext.ActionParameters;
            string url         = null;
            string requestUrl  = null;
            string searchQuery = null;
            searchQuery = filterContext.RequestContext.HttpContext.Request.QueryString.ToString();
            requestUrl  = filterContext.RequestContext.HttpContext.Request.RawUrl;

            // Check controller
            // If AdLIst
            if (filterContext.ActionDescriptor.ActionName.Equals("AdList"))
            {
                // Allow query strings for catId subCatId CountryId RegionId
                var    newSearchQuery  = HttpUtility.ParseQueryString(searchQuery);
                int    catId           = 0;
                int    subCatId        = 0;
                int    CountryId       = 0;
                int    RegionId        = 0;
                string modelBodyType   = null;
                string modelRentalType = null;

                int.TryParse(newSearchQuery.Get("catId"), out catId);
                newSearchQuery.Remove("catId");
                int.TryParse(newSearchQuery.Get("subCatId"), out subCatId);
                newSearchQuery.Remove("subCatId");
                int.TryParse(newSearchQuery.Get("CountryId"), out CountryId);
                newSearchQuery.Remove("CountryId");
                int.TryParse(newSearchQuery.Get("RegionId"), out RegionId);
                newSearchQuery.Remove("RegionId");
                modelBodyType = newSearchQuery.Get("modelBodyType");
                newSearchQuery.Remove("modelBodyType");
                modelBodyType = newSearchQuery.Get("modelRentalType");
                newSearchQuery.Remove("modelRentalType");

                searchQuery = newSearchQuery.ToString();

                if (catId > 0 || subCatId > 0 || CountryId > 0 || RegionId > 0)
                {
                    if (catId == 0)
                    {
                        catId = (int)parameters["catId"];
                    }
                    if (subCatId == 0)
                    {
                        subCatId = (int)parameters["subCatId"];
                    }
                    if (CountryId == 0)
                    {
                        CountryId = (int)parameters["CountryId"];
                    }
                    if (RegionId == 0)
                    {
                        RegionId = (int)parameters["RegionId"];
                    }
                    url = SeoManager.GenerateAdListUrl(
                        ref catId,
                        ref subCatId,
                        ref CountryId,
                        ref RegionId);
                    if (catId > 0)
                    {
                        parameters["catId"] = catId;
                    }
                    if (subCatId > 0)
                    {
                        parameters["subCatId"] = subCatId;
                    }
                    if (CountryId > 0)
                    {
                        parameters["CountryId"] = CountryId;
                    }
                    if (RegionId > 0)
                    {
                        parameters["RegionId"] = RegionId;
                    }
                }
                else
                {
                    url = SeoManager.GenerateAdListUrl(
                        (int)parameters["catId"],
                        (int)parameters["subCatId"],
                        (int)parameters["CountryId"],
                        (int)parameters["RegionId"]);
                }

                if (url == null)
                {
                    filterContext.Result = new HttpStatusCodeResult(404);
                    return;
                }
                else
                {
                    // Append searchString to url
                    if (filterContext.Controller.TempData["AdSearchIdNotFound"] == null)
                    {
                        url = string.Format("{0}{1}", url, searchString != null ? "/" + new SeoManager().GetSeoTitle(searchString) : null);
                    }
                }

                // check if modelbodytype value is a parameter
                if (modelBodyType == null)
                {
                    modelBodyType = (string)parameters["modelBodyType"];
                }
                // check if modelrentaltype value is a parameter
                if (modelRentalType == null)
                {
                    modelRentalType = (string)parameters["modelRentalType"];
                }

                // insert modelbodytype into url
                if (modelBodyType != null && url.Contains("vehicles-cars-trucks"))
                {
                    url = url.Replace("vehicles-cars-trucks/", "vehicles-cars-trucks/" + modelBodyType + "/");
                }
                // insert modelrentaltype into url
                if (modelRentalType != null && url.Contains("real-estate-apartments-condos-rental"))
                {
                    url = url.Replace("real-estate-apartments-condos-rental/", "real-estate-apartments-condos-rental/" + modelRentalType + "/");
                }
                if (modelRentalType != null && url.Contains("real-estate-land-rental-leasing"))
                {
                    url = url.Replace("real-estate-land-rental-leasing/", "real-estate-land-rental-leasing/" + modelRentalType + "/");
                }
                if (modelRentalType != null && url.Contains("real-estate-house-rental"))
                {
                    url = url.Replace("real-estate-house-rental/", "real-estate-house-rental/" + modelRentalType + "/");
                }
            }

            // If ListDetails
            else if (filterContext.ActionDescriptor.ActionName.Equals("AdDetails"))
            {
                url = SeoManager.GenerateAdDetailUrl((int)parameters["Id"]);
                if (url == null)
                {
                    // check if ad is suspended
                    if (SeoManager.IsAdSuspended((int)parameters["Id"]))
                    {
                        filterContext.Result = new RedirectResult(new UrlHelper(filterContext.RequestContext).Action("AdSuspended", "Errors", new { Area = "" }));
                        return;
                    }
                    filterContext.Result = new HttpStatusCodeResult(410);
                    return;
                }
            }

            // Compare ulrs
            if (url != null)
            {
                var responseUrl = string.Format("{0}{1}", url, searchQuery != "" ? "?" + searchQuery : null);
                if (requestUrl != responseUrl)
                {
                    filterContext.Result = new RedirectResult(responseUrl, true);
                    filterContext.Controller.TempData["wasRedirected"] = true;
                    return;
                }
            }
#if DEBUG
        }
#endif
        }