public ActionResult CreateSubSite(CreateSubSiteViewModel model)
        {
            switch (model.Step)
            {
                case CreateSiteStep.SiteInformation:
                    ModelState.Clear();

                    // If it is the first time that we are here
                    if (String.IsNullOrEmpty(model.Title))
                    {
                        model.InheritPermissions = true;
                        using (var ctx = PnPPartnerPackContextProvider.GetAppOnlyClientContext(model.ParentSiteUrl))
                        {
                            Web web = ctx.Web;
                            ctx.Load(web, w => w.Language, w => w.RegionalSettings.TimeZone);
                            ctx.ExecuteQueryRetry();

                            model.Language = (Int32)web.Language;
                            model.TimeZone = web.RegionalSettings.TimeZone.Id;
                        }
                    }
                    break;
                case CreateSiteStep.TemplateParameters:
                    if (!ModelState.IsValid)
                    {
                        model.Step = CreateSiteStep.SiteInformation;
                    }
                    else
                    {
                        if (!String.IsNullOrEmpty(model.ProvisioningTemplateUrl) &&
                            model.ProvisioningTemplateUrl.IndexOf(PnPPartnerPackConstants.PnPProvisioningTemplates) > 0)
                        {
                            String templateSiteUrl = model.ProvisioningTemplateUrl.Substring(0, model.ProvisioningTemplateUrl.IndexOf(PnPPartnerPackConstants.PnPProvisioningTemplates));
                            String templateFileName = model.ProvisioningTemplateUrl.Substring(model.ProvisioningTemplateUrl.IndexOf(PnPPartnerPackConstants.PnPProvisioningTemplates) + PnPPartnerPackConstants.PnPProvisioningTemplates.Length + 1);
                            String templateFolder = String.Empty;

                            if (templateFileName.IndexOf("/") > 0)
                            {
                                templateFolder = templateFileName.Substring(0, templateFileName.LastIndexOf("/") - 1);
                                templateFileName = templateFileName.Substring(templateFolder.Length + 1);
                            }
                            model.TemplateParameters = PnPPartnerPackUtilities.GetProvisioningTemplateParameters(
                                    templateSiteUrl,
                                    templateFolder,
                                    templateFileName);
                        }
                    }
                    break;
                case CreateSiteStep.SiteCreated:
                    AntiForgery.Validate();
                    if (ModelState.IsValid)
                    {
                        // Prepare the Job to provision the Sub Site
                        SubSiteProvisioningJob job = new SubSiteProvisioningJob();

                        // Prepare all the other information about the Provisioning Job
                        job.SiteTitle = model.Title;
                        job.Description = model.Description;
                        job.Language = model.Language;
                        job.TimeZone = model.TimeZone;
                        job.ParentSiteUrl = model.ParentSiteUrl;
                        job.RelativeUrl = model.RelativeUrl;
                        job.SitePolicy = model.SitePolicy;
                        job.Owner = ClaimsPrincipal.Current.Identity.Name;
                        job.ProvisioningTemplateUrl = model.ProvisioningTemplateUrl;
                        job.InheritPermissions = model.InheritPermissions;
                        job.Title = String.Format("Provisioning of Sub Site \"{1}\" with Template \"{0}\" by {2}",
                            job.ProvisioningTemplateUrl,
                            job.RelativeUrl,
                            job.Owner);

                        job.TemplateParameters = model.TemplateParameters;

                        model.JobId = ProvisioningRepositoryFactory.Current.EnqueueProvisioningJob(job);
                    }
                    break;
                default:
                    break;
            }

            return PartialView(model.Step.ToString(), model);
        }
        public ActionResult CreateSubSite(CreateSubSiteViewModel model)
        {
            PnPPartnerPackSettings.ParentSiteUrl = model.ParentSiteUrl;

            if (model.Step == CreateSiteStep.SiteInformation)
            {
                ModelState.Clear();

                // If it is the first time that we are here
                if (String.IsNullOrEmpty(model.Title))
                {
                    model.InheritPermissions = true;
                    using (var ctx = PnPPartnerPackContextProvider.GetAppOnlyClientContext(model.ParentSiteUrl))
                    {
                        Web web = ctx.Web;
                        ctx.Load(web, w => w.Language, w => w.RegionalSettings.TimeZone);
                        ctx.ExecuteQueryRetry();

                        model.Language = (Int32)web.Language;
                        model.TimeZone = web.RegionalSettings.TimeZone.Id;
                    }
                }
            }
            if (model.Step == CreateSiteStep.TemplateParameters)
            {
                if (!ModelState.IsValid)
                {
                    model.Step = CreateSiteStep.SiteInformation;
                }
                else
                {
                    if (!String.IsNullOrEmpty(model.ProvisioningTemplateUrl) &&
                        !String.IsNullOrEmpty(model.TemplatesProviderTypeName))
                    {
                        var templatesProvider = PnPPartnerPackSettings.TemplatesProviders[model.TemplatesProviderTypeName];
                        if (templatesProvider != null)
                        {
                            var template = templatesProvider.GetProvisioningTemplate(model.ProvisioningTemplateUrl);
                            model.TemplateParameters = template.Parameters;
                        }

                        if (model.TemplateParameters == null || model.TemplateParameters.Count == 0)
                        {
                            model.Step = CreateSiteStep.SiteCreated;
                        }
                    }
                }
            }
            if (model.Step == CreateSiteStep.SiteCreated)
            {
                AntiForgery.Validate();
                if (ModelState.IsValid)
                {
                    // Prepare the Job to provision the Sub Site
                    SubSiteProvisioningJob job = new SubSiteProvisioningJob();

                    // Prepare all the other information about the Provisioning Job
                    job.SiteTitle = model.Title;
                    job.Description = model.Description;
                    job.Language = model.Language;
                    job.TimeZone = model.TimeZone;
                    job.ParentSiteUrl = model.ParentSiteUrl;
                    job.RelativeUrl = model.RelativeUrl;
                    job.SitePolicy = model.SitePolicy;
                    job.Owner = ClaimsPrincipal.Current.Identity.Name;
                    job.ApplyTenantBranding = model.ApplyTenantBranding;

                    job.ProvisioningTemplateUrl = model.ProvisioningTemplateUrl;
                    job.TemplatesProviderTypeName = model.TemplatesProviderTypeName;
                    job.InheritPermissions = model.InheritPermissions;
                    job.Title = String.Format("Provisioning of Sub Site \"{1}\" with Template \"{0}\" by {2}",
                        job.ProvisioningTemplateUrl,
                        job.RelativeUrl,
                        job.Owner);

                    job.TemplateParameters = model.TemplateParameters;

                    model.JobId = ProvisioningRepositoryFactory.Current.EnqueueProvisioningJob(job);
                }
            }

            return PartialView(model.Step.ToString(), model);
        }