Comments (0) Basic Setup for IIS

Installing nopCommerce and having issues ?

Here is a document which shows the basic Setup for IIS
You can download here

Or check for errors on a New Installation Here

Comments (0) Custom View Engine
You can override the default _AddToCart.cshtml or one in another pluign using a Custom View Engine
Comments (0) Display a PDF from Jscipt Ajax Call

I searched for the answer for a while before I found this works

                    cache: false,
                    type: "POST",
                    url: "@Html.Raw(Url.Action("DailyReport"))?date=" + $('#EventStartDateTimeUtc').val() +
                        "&groupProductId=" + ddlGroupProductId + "&associatedProductId=" + ddlAssociatedProducts,
                    xhrFields: { responseType: "blob" },
                    success: function (data) {
                        var blob = new Blob([data]);
                        var link = document.createElement('a');
                        link.href = window.URL.createObjectURL(blob);
               = "Daily_Report_" + $('#EventStartDateTimeUtc').val() + ".pdf";
                        var file = new File([blob], filename, { type: 'application/force-download' });
                    error: function (error) {
                        alert("Error: " + error);

Comments (0) Developing with Paypal

For Paypal Commerce Plugin I have setup Sandbox and can do transactions no problem.

But where do you see the transactions in Paypal when using the Sandbox like you would in your Buinsess Dashboard ?
What is the link ?

One option is lookign at notifications See

Notifications only show the emails sent to the buyer and don't contain full transaction details, though they can be used as a confirmation of successful payments without visiting a sandbox account.

The other option is using Sandbox.

The link is, this sandbox test site mirrors the features on the PayPal production servers.

You can create an individual test account, or use the ones automatically created for a developer account (
You have to set up a sandbox in the plugin configuration and pay with the above test account during the checkout. Transactions will be shown on the sandbox test site (, just like for a Business account.


Comments (0) Testing/debugging multi-store on Localhost
You can create New Local use Domains in the Local DNS
Comments (0) nopCommerce Plugin Development Manual
This guide covers various aspects, best practices and approaches for nopCommerce plugin development. Plugin is a software component enabling nopCommerce basic features extension. There is an official nopCommerce plugin marketplace distributing both free and paid plugins. Plugins enable developers to add new features and/or customize a UI theme without modifying nopCommerce source code. This is important for stable running of a web application and for upgrading nopCommerce platform to newer versions.
Comments (0) Architecture of nopCommerce

nopCommerce is a highly customizable and flexible, multi-store, multi-vendor, SEO friendly, full featured open-source E-Commerce solution. Which is build on top of Microsoft ASP.NET Core framework. nopCommerce is always up to date with latest technology and follows best practices.

See Architecture of nopCommerce

Comments (0) Calling a Partial View of Nop.Web from Plugin Custom View Engine

One of the nice feature of the .NetCore framework is its pluggability. This means you can completely replace the default view engine(s) with a custom one.

One of the reason for using a custom view engine is to change the default views location and sometimes you need to change the views location at run-time. To do this you can extend the default view engine(s) and then change the default views location variables at run-time. 

Here is an example when the default Checkout Views are replaced with Partial Views loaded from a Payment Plugin 

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc.Razor;

using Nop.Core;
using Nop.Core.Data;
using Nop.Core.Infrastructure;
using Nop.Services.Plugins;
using Nop.Services.Configuration;

using Nop.Web.Framework.Themes;

namespace Nop.Plugin.Pluign.Name.ViewEngine
    public class CustomViewEngine : IViewLocationExpander

        public string storeTheme = "DefaultClean";

        public void PopulateValues(ViewLocationExpanderContext context)
            if (context.AreaName?.Equals("Admin") ?? false)

            var settingService = EngineContext.Current.Resolve<ISettingService>();
            var storeContext = EngineContext.Current.Resolve<IStoreContext>();

            storeTheme = settingService.GetSettingByKey("storeinformationsettings.defaultstoretheme", "DefaultClean", storeContext.CurrentStore.Id, true);

            var themeContext = (IThemeContext)context.ActionContext.HttpContext.RequestServices.GetService(typeof(IThemeContext));
            context.Values[storeTheme] = themeContext.WorkingThemeName;

        public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations)

            //Confirm database is installed
            if (DataSettingsManager.DatabaseIsInstalled)
                var pluginService = EngineContext.Current.Resolve<IPluginService>();

                var plugin = pluginService.GetPluginDescriptorBySystemName<IPlugin>("Plugin.Name", LoadPluginsMode.InstalledOnly);
                if (plugin != null)
                    if (plugin.SystemName == "Plugin.Name")
                        if (context.AreaName == "Admin")

                            if (!context.Values.TryGetValue(storeTheme, out string theme))
                                return viewLocations;
                            if (context.ControllerName == "RealOnePageCheckout" && context.ViewName == "RealOnePageCheckout")
                                viewLocations = new[] { $"~/Plugins/Plugin.Name/Views/FrontView/RealOnePageCheckout.cshtml" }.Concat(viewLocations);
                            else if (context.ControllerName == "Checkout" && context.ViewName == "BillingAddress")
                                viewLocations = new[] { $"~/Plugins/Plugin.Name/Views/FrontView/BillingAddress.cshtml" }.Concat(viewLocations);
                            else if (context.ControllerName == "Checkout" && context.ViewName == "ShippingMethod")
                                viewLocations = new[] { $"~/Plugins/Plugin.Name/Views/FrontView/ShippingMethod.cshtml" }.Concat(viewLocations);
                            else if (context.ControllerName == "Checkout" && context.ViewName == "OpcShippingMethods")
                                viewLocations = new[] { $"~/Plugins/Plugin.Name/Views/FrontView/OpcShippingMethods.cshtml" }.Concat(viewLocations);
                            else if (context.ControllerName == "Checkout" && context.ViewName == "Completed")
                                viewLocations = new[] { $"~/Plugins/Plugin.Name/Views/FrontView/Completed.cshtml" }.Concat(viewLocations);

            return viewLocations;

Comments (0) nopCommerce Directory Structure
The images privides and look at what a .NetCore nopCommerce Directory Structure looks like when setup for IIS
Comments (0) nopCommerce Forums Posts for later