public ActionResult ProductDetails(int productId, string attributes) { var product = _productService.GetProductById(productId); if (product == null || product.Deleted) return HttpNotFound(); //Is published? //Check whether the current user has a "Manage catalog" permission //It allows him to preview a product before publishing if (!product.Published && !_services.Permissions.Authorize(StandardPermissionProvider.ManageCatalog)) return HttpNotFound(); //ACL (access control list) if (!_aclService.Authorize(product)) return HttpNotFound(); //Store mapping if (!_storeMappingService.Authorize(product)) return HttpNotFound(); //visible individually? if (!product.VisibleIndividually) { //is this one an associated products? var parentGroupedProduct = _productService.GetProductById(product.ParentGroupedProductId); if (parentGroupedProduct != null) { return RedirectToRoute("Product", new { SeName = parentGroupedProduct.GetSeName() }); } else { return HttpNotFound(); } } //prepare the model var selectedAttributes = new FormCollection(); selectedAttributes.ConvertAttributeQueryData(_productAttributeParser.DeserializeQueryData(attributes), product.Id); var model = _helper.PrepareProductDetailsPageModel(product, selectedAttributes: selectedAttributes); //save as recently viewed _recentlyViewedProductsService.AddProductToRecentlyViewedList(product.Id); //activity log _services.CustomerActivity.InsertActivity("PublicStore.ViewProduct", T("ActivityLog.PublicStore.ViewProduct"), product.Name); return View(model.ProductTemplateViewPath, model); }