public override async Task GenerateCode(ViewGeneratorModel viewGeneratorModel) { if (viewGeneratorModel == null) { throw new ArgumentNullException(nameof(viewGeneratorModel)); } if (string.IsNullOrEmpty(viewGeneratorModel.ViewName)) { throw new ArgumentException(MessageStrings.ViewNameRequired); } if (string.IsNullOrEmpty(viewGeneratorModel.TemplateName)) { throw new ArgumentException(MessageStrings.TemplateNameRequired); } ModelTypeAndContextModel modelTypeAndContextModel = null; var outputPath = ValidateAndGetOutputPath(viewGeneratorModel, outputFileName: viewGeneratorModel.ViewName + Constants.ViewExtension); EFValidationUtil.ValidateEFDependencies(_projectContext.PackageDependencies); modelTypeAndContextModel = await ModelMetadataUtilities.ValidateModelAndGetEFMetadata( viewGeneratorModel, _entityFrameworkService, _modelTypesLocator, string.Empty); await GenerateView(viewGeneratorModel, modelTypeAndContextModel, outputPath); if (modelTypeAndContextModel.ContextProcessingResult.ContextProcessingStatus == ContextProcessingStatus.ContextAddedButRequiresConfig) { throw new Exception(string.Format("{0} {1}", MessageStrings.ScaffoldingSuccessful_unregistered, MessageStrings.Scaffolding_additionalSteps)); } }
public override async Task GenerateCode(ViewGeneratorModel viewGeneratorModel) { if (viewGeneratorModel == null) { throw new ArgumentNullException(nameof(viewGeneratorModel)); } if (string.IsNullOrEmpty(viewGeneratorModel.ViewName)) { throw new ArgumentException(MessageStrings.ViewNameRequired); } if (string.IsNullOrEmpty(viewGeneratorModel.TemplateName)) { throw new ArgumentException(MessageStrings.TemplateNameRequired); } ModelTypeAndContextModel modelTypeAndContextModel = null; var outputPath = ValidateAndGetOutputPath(viewGeneratorModel, outputFileName: viewGeneratorModel.ViewName + Constants.ViewExtension); modelTypeAndContextModel = await ModelMetadataUtilities.ValidateModelAndGetCodeModelMetadata(viewGeneratorModel, _codeModelService, _modelTypesLocator); var layoutDependencyInstaller = ActivatorUtilities.CreateInstance <MvcLayoutDependencyInstaller>(_serviceProvider); await layoutDependencyInstaller.Execute(); await GenerateView(viewGeneratorModel, modelTypeAndContextModel, outputPath); await layoutDependencyInstaller.InstallDependencies(); }
internal async Task GenerateViews(RazorPageGeneratorModel razorPageGeneratorModel) { if (razorPageGeneratorModel == null) { throw new ArgumentNullException(nameof(razorPageGeneratorModel)); } if (razorPageGeneratorModel.NoPageModel) { // Throw not supported exception. throw new ArgumentException(MessageStrings.PageModelFlagNotSupported); } IDictionary <string, string> viewAndTemplateNames = new Dictionary <string, string>(); foreach (string viewTemplate in Views) { string viewName = viewTemplate == "List" ? "Index" : viewTemplate; viewAndTemplateNames.Add(viewName, viewTemplate); } ModelTypeAndContextModel modelTypeAndContextModel = null; string outputPath = ValidateAndGetOutputPath(razorPageGeneratorModel, string.Empty); EFValidationUtil.ValidateEFDependencies(_projectContext.PackageDependencies); modelTypeAndContextModel = await ModelMetadataUtilities.ValidateModelAndGetEFMetadata( razorPageGeneratorModel, _entityFrameworkService, _modelTypesLocator, string.Empty); await BaseGenerateViews(viewAndTemplateNames, razorPageGeneratorModel, modelTypeAndContextModel, outputPath); }
private async Task GenerateViewsIfRequired(CommandLineGeneratorModel controllerGeneratorModel, ModelTypeAndContextModel modelTypeAndContextModel, string controllerRootName) { if (!controllerGeneratorModel.IsRestController && !controllerGeneratorModel.NoViews) { var viewGenerator = ActivatorUtilities.CreateInstance <EFModelBasedViewScaffolder>(ServiceProvider); var areaPath = string.IsNullOrEmpty(_areaName) ? string.Empty : Path.Combine("Areas", _areaName); var viewBaseOutputPath = Path.Combine( ApplicationInfo.ApplicationBasePath, areaPath, Constants.ViewsFolderName, controllerRootName); var viewGeneratorModel = new ViewGeneratorModel() { UseDefaultLayout = controllerGeneratorModel.UseDefaultLayout, PartialView = false, LayoutPage = controllerGeneratorModel.LayoutPage, Force = controllerGeneratorModel.Force, RelativeFolderPath = viewBaseOutputPath, ReferenceScriptLibraries = controllerGeneratorModel.ReferenceScriptLibraries, BootstrapVersion = controllerGeneratorModel.BootstrapVersion }; var viewAndTemplateNames = new Dictionary <string, string>(); foreach (var viewTemplate in _views) { var viewName = viewTemplate == "List" ? "Index" : viewTemplate; viewAndTemplateNames.Add(viewName, viewTemplate); } await viewGenerator.GenerateViews(viewAndTemplateNames, viewGeneratorModel, modelTypeAndContextModel, viewBaseOutputPath); } }
/// <summary> /// GenerateView /// </summary> /// <param name="viewGeneratorModel"></param> /// <param name="modelTypeAndContextModel"></param> /// <param name="outputPath"></param> /// <returns></returns> /// <remarks> /// only this method, got from: https://github.com/aspnet/Scaffolding/blob/1.1.3/src/Microsoft.VisualStudio.Web.CodeGenerators.Mvc/View/ViewScaffolderBase.cs /// </remarks> internal async Task GenerateView(ViewGeneratorModel viewGeneratorModel, ModelTypeAndContextModel modelTypeAndContextModel, string outputPath) { if (viewGeneratorModel.ViewName.EndsWith(Constants.ViewExtension, StringComparison.OrdinalIgnoreCase)) { int viewNameLength = viewGeneratorModel.ViewName.Length - Constants.ViewExtension.Length; viewGeneratorModel.ViewName = viewGeneratorModel.ViewName.Substring(0, viewNameLength); } var templateModel = GetViewGeneratorTemplateModel(viewGeneratorModel, modelTypeAndContextModel); var templateName = viewGeneratorModel.TemplateName + Constants.RazorTemplateExtension; await _codeGeneratorActionsService.AddFileFromTemplateAsync(outputPath, templateName, TemplateFolders, templateModel); _logger.LogMessage("Added View : " + outputPath.Substring(ApplicationInfo.ApplicationBasePath.Length)); await AddRequiredFiles(viewGeneratorModel); }
public override async Task GenerateCode(RazorPageGeneratorModel razorGeneratorModel) { if (razorGeneratorModel == null) { throw new ArgumentNullException(nameof(razorGeneratorModel)); } if (string.IsNullOrEmpty(razorGeneratorModel.RazorPageName)) { throw new ArgumentException(MessageStrings.RazorPageNameRequired); } if (string.IsNullOrEmpty(razorGeneratorModel.TemplateName)) { throw new ArgumentException(MessageStrings.TemplateNameRequired); } if (razorGeneratorModel.NoPageModel) { // Throw not supported exception. throw new ArgumentException(MessageStrings.PageModelFlagNotSupported); } ModelTypeAndContextModel modelTypeAndContextModel = null; var outputPath = ValidateAndGetOutputPath(razorGeneratorModel, outputFileName: razorGeneratorModel.RazorPageName + Constants.ViewExtension); EFValidationUtil.ValidateEFDependencies(_projectContext.PackageDependencies); modelTypeAndContextModel = await ModelMetadataUtilities.ValidateModelAndGetEFMetadata( razorGeneratorModel, _entityFrameworkService, _modelTypesLocator, string.Empty); var layoutDependencyInstaller = ActivatorUtilities.CreateInstance <MvcLayoutDependencyInstaller>(_serviceProvider); await layoutDependencyInstaller.Execute(); await GenerateView(razorGeneratorModel, modelTypeAndContextModel, outputPath); await layoutDependencyInstaller.InstallDependencies(); if (modelTypeAndContextModel.ContextProcessingResult.ContextProcessingStatus == ContextProcessingStatus.ContextAddedButRequiresConfig) { throw new Exception(string.Format("{0} {1}", MessageStrings.ScaffoldingSuccessful_unregistered, MessageStrings.Scaffolding_additionalSteps)); } }
public override async Task GenerateCode(ViewGeneratorModel viewGeneratorModel) { if (viewGeneratorModel == null) { throw new ArgumentNullException(nameof(viewGeneratorModel)); } if (string.IsNullOrEmpty(viewGeneratorModel.ViewName)) { throw new ArgumentException(MessageStrings.ViewNameRequired); } if (string.IsNullOrEmpty(viewGeneratorModel.TemplateName)) { throw new ArgumentException(MessageStrings.TemplateNameRequired); } ModelTypeAndContextModel modelTypeAndContextModel = null; var outputPath = ValidateAndGetOutputPath(viewGeneratorModel, outputFileName: viewGeneratorModel.ViewName + Constants.ViewExtension); if (string.IsNullOrEmpty(viewGeneratorModel.DataContextClass)) { modelTypeAndContextModel = await ModelMetadataUtilities.ValidateModelAndGetCodeModelMetadata(viewGeneratorModel, _entityFrameworkService, _modelTypesLocator); } else { modelTypeAndContextModel = await ModelMetadataUtilities.ValidateModelAndGetEFMetadata( viewGeneratorModel, _entityFrameworkService, _modelTypesLocator, string.Empty); } var layoutDependencyInstaller = ActivatorUtilities.CreateInstance <MvcLayoutDependencyInstaller>(_serviceProvider); await layoutDependencyInstaller.Execute(); await GenerateView(viewGeneratorModel, modelTypeAndContextModel, outputPath); await layoutDependencyInstaller.InstallDependencies(); if (modelTypeAndContextModel.ContextProcessingResult.ContextProcessingStatus == ContextProcessingStatus.ContextAddedButRequiresConfig) { throw new Exception(string.Format("{0} {1}", MessageStrings.ScaffoldingSuccessful_unregistered, MessageStrings.Scaffolding_additionalSteps)); } }
private async Task GenerateViewsIfRequired(CommandLineGeneratorModel controllerGeneratorModel, ModelTypeAndContextModel modelTypeAndContextModel, string controllerRootName) { if (!controllerGeneratorModel.IsRestController && !controllerGeneratorModel.NoViews) { var layoutDependencyInstaller = ActivatorUtilities.CreateInstance <MvcLayoutDependencyInstaller>(ServiceProvider); await layoutDependencyInstaller.Execute(); foreach (var viewTemplate in _views) { var viewName = viewTemplate == "List" ? "Index" : viewTemplate; // ToDo: This is duplicated from ViewGenerator. bool isLayoutSelected = controllerGeneratorModel.UseDefaultLayout || !String.IsNullOrEmpty(controllerGeneratorModel.LayoutPage); var viewTemplateModel = new ViewGeneratorTemplateModel() { ViewDataTypeName = modelTypeAndContextModel.ModelType.FullName, ViewDataTypeShortName = modelTypeAndContextModel.ModelType.Name, ViewName = viewName, LayoutPageFile = controllerGeneratorModel.LayoutPage, IsLayoutPageSelected = isLayoutSelected, IsPartialView = false, ReferenceScriptLibraries = controllerGeneratorModel.ReferenceScriptLibraries, ModelMetadata = modelTypeAndContextModel.ContextProcessingResult.ModelMetadata, JQueryVersion = "1.10.2" }; // Todo: Need logic for areas var viewOutputPath = Path.Combine( ApplicationInfo.ApplicationBasePath, Constants.ViewsFolderName, controllerRootName, viewName + Constants.ViewExtension); await CodeGeneratorActionsService.AddFileFromTemplateAsync(viewOutputPath, viewTemplate + Constants.RazorTemplateExtension, TemplateFolders, viewTemplateModel); Logger.LogMessage("Added View : " + viewOutputPath.Substring(ApplicationInfo.ApplicationBasePath.Length)); } await layoutDependencyInstaller.InstallDependencies(); } }
private async Task GenerateViewsIfRequired(CommandLineGeneratorModel controllerGeneratorModel, ModelTypeAndContextModel modelTypeAndContextModel, string controllerRootName) { if (!controllerGeneratorModel.IsRestController && !controllerGeneratorModel.NoViews) { var layoutDependencyInstaller = ActivatorUtilities.CreateInstance<MvcLayoutDependencyInstaller>(ServiceProvider); await layoutDependencyInstaller.Execute(); foreach (var viewTemplate in _views) { var viewName = viewTemplate == "List" ? "Index" : viewTemplate; // ToDo: This is duplicated from ViewGenerator. bool isLayoutSelected = controllerGeneratorModel.UseDefaultLayout || !String.IsNullOrEmpty(controllerGeneratorModel.LayoutPage); var viewTemplateModel = new ViewGeneratorTemplateModel() { ViewDataTypeName = modelTypeAndContextModel.ModelType.FullName, ViewDataTypeShortName = modelTypeAndContextModel.ModelType.Name, ViewName = viewName, LayoutPageFile = controllerGeneratorModel.LayoutPage, IsLayoutPageSelected = isLayoutSelected, IsPartialView = false, ReferenceScriptLibraries = controllerGeneratorModel.ReferenceScriptLibraries, ModelMetadata = modelTypeAndContextModel.ContextProcessingResult.ModelMetadata, JQueryVersion = "1.10.2" }; // Todo: Need logic for areas var viewOutputPath = Path.Combine( ApplicationEnvironment.ApplicationBasePath, Constants.ViewsFolderName, controllerRootName, viewName + Constants.ViewExtension); await CodeGeneratorActionsService.AddFileFromTemplateAsync(viewOutputPath, viewTemplate + Constants.RazorTemplateExtension, TemplateFolders, viewTemplateModel); Logger.LogMessage("Added View : " + viewOutputPath.Substring(ApplicationEnvironment.ApplicationBasePath.Length)); } await layoutDependencyInstaller.InstallDependencies(); } }
internal async Task GenerateModel( ModelGeneratorModel generatorModel, ModelTypeAndContextModel modelTypeAndContextModel, string outputPath) { var templateName = generatorModel.TemplateName + Constants.RazorTemplateExtension; await _codeGeneratorActionsService.AddFileFromTemplateAsync( outputPath, templateName, TemplateFolders, generatorModel ); this._logger.LogMessage("Added Model : " + outputPath.Substring(ApplicationInfo.ApplicationBasePath.Length)); await AddRequiredFiles(generatorModel); }
public override async Task GenerateCode(ViewGeneratorModel viewGeneratorModel) { if (viewGeneratorModel == null) { throw new ArgumentNullException(nameof(viewGeneratorModel)); } if (string.IsNullOrEmpty(viewGeneratorModel.ViewName)) { throw new ArgumentException(MessageStrings.ViewNameRequired); } if (string.IsNullOrEmpty(viewGeneratorModel.TemplateName)) { throw new ArgumentException(MessageStrings.TemplateNameRequired); } ModelTypeAndContextModel modelTypeAndContextModel = null; var outputPath = ValidateAndGetOutputPath(viewGeneratorModel, outputFileName: viewGeneratorModel.ViewName + Constants.ViewExtension); modelTypeAndContextModel = await ModelMetadataUtilities.ValidateModelAndGetCodeModelMetadata(viewGeneratorModel, _codeModelService, _modelTypesLocator); await GenerateView(viewGeneratorModel, modelTypeAndContextModel, outputPath); }
/// <summary> /// Exec code generation /// </summary> /// <param name="genModel"></param> /// <returns></returns> public async Task GenerateCode(XbCodeGeneratorModel genModel) { try { if (genModel == null) { throw new ArgumentNullException(nameof(genModel)); } this._modelName = genModel.ModelName ?? throw new ArgumentException(MessageStrings.ModelNameRequired); this._dbContextName = genModel.DbContextName ?? throw new ArgumentException(MessageStrings.DbContextNameRequired); this._controllerName = genModel.ControllerName ?? throw new ArgumentException(MessageStrings.ControllerNameRequired); this._areaName = genModel.AreaName; // When multiple this NuGet packages are installed, // depending on the situation, older versions may be used. var version = this.GetType().GetTypeInfo().Assembly.GetName().Version.ToString(); this._logger.LogMessage($"Generator version: {version}"); if (!string.IsNullOrEmpty(genModel.ControllerName) && (Xb.Str.Right(genModel.ControllerName, 10).ToLower() == "controller")) { this._controllerName = genModel.ControllerName; this._baseName = Xb.Str.SliceReverse(genModel.ControllerName, -10); } else { this._controllerName = genModel.ControllerName + "Controller"; this._baseName = genModel.ControllerName; } var cgModel = new CommandLineGeneratorModel() { ModelClass = this._modelName, DataContextClass = this._dbContextName, ControllerName = this._controllerName, RelativeFolderPath = string.IsNullOrEmpty(this._areaName) ? "Controllers" : Path.Combine("Areas", this._areaName, "Controllers") }; this._modelTypeAndContextModel = await ModelMetadataUtilities.ValidateModelAndGetEFMetadata( cgModel, this._entityFrameworkService, this._modelTypesLocator, this._areaName ); this._logger.LogMessage($"Model name: {this._modelName}"); this._logger.LogMessage($"DbContext name: {this._dbContextName}"); this._logger.LogMessage($"Controller name: {this._controllerName}" + ((this._controllerName == genModel.ControllerName) ? "" : $" (passing: {genModel.ControllerName})")); this._logger.LogMessage($"Area name: {this._areaName}"); await this.GenerateControllerAndViews(cgModel); await this.GenerateStore(); await this.GenerateViewModel(); } catch (Exception ex) { this._logger?.LogMessage(Xb.Util.GetErrorHighlighted(ex)); throw ex; } }
protected RazorPageWithContextTemplateModel GetRazorPageWithContextTemplateModel(RazorPageGeneratorModel razorGeneratorModel, ModelTypeAndContextModel modelTypeAndContextModel) { bool isLayoutSelected = !razorGeneratorModel.PartialView && (razorGeneratorModel.UseDefaultLayout || !String.IsNullOrEmpty(razorGeneratorModel.LayoutPage)); var namespaceName = string.IsNullOrEmpty(razorGeneratorModel.NamespaceName) ? GetDefaultPageModelNamespaceName(razorGeneratorModel.RelativeFolderPath) : razorGeneratorModel.NamespaceName; if (string.IsNullOrEmpty(razorGeneratorModel.BootstrapVersion)) { razorGeneratorModel.BootstrapVersion = RazorPageScaffolderBase.DefaultBootstrapVersion; } RazorPageWithContextTemplateModel2 templateModel = new RazorPageWithContextTemplateModel2(modelTypeAndContextModel.ModelType, modelTypeAndContextModel.DbContextFullName) { NamespaceName = namespaceName, NoPageModel = razorGeneratorModel.NoPageModel, PageModelClassName = razorGeneratorModel.RazorPageName + "Model", ViewDataTypeName = modelTypeAndContextModel?.ModelType?.FullName, ViewDataTypeShortName = modelTypeAndContextModel?.ModelType?.Name, ContextTypeName = modelTypeAndContextModel?.DbContextFullName, RazorPageName = razorGeneratorModel.RazorPageName, LayoutPageFile = razorGeneratorModel.LayoutPage, IsLayoutPageSelected = isLayoutSelected, IsPartialView = razorGeneratorModel.PartialView, ReferenceScriptLibraries = razorGeneratorModel.ReferenceScriptLibraries, ModelMetadata = modelTypeAndContextModel?.ContextProcessingResult?.ModelMetadata, JQueryVersion = "1.10.2", //Todo BootstrapVersion = razorGeneratorModel.BootstrapVersion, ContentVersion = DetermineContentVersion(razorGeneratorModel) }; return(templateModel); }
// TODO: rework this to use the TemplateModel, as opposed to the RazorPageGeneratorModel (command line model) internal async Task GenerateView(RazorPageGeneratorModel razorGeneratorModel, ModelTypeAndContextModel modelTypeAndContextModel, string outputPath) { IEnumerable <string> templateFolders = GetTemplateFoldersForContentVersion(); if (razorGeneratorModel.RazorPageName.EndsWith(Constants.ViewExtension, StringComparison.OrdinalIgnoreCase)) { int viewNameLength = razorGeneratorModel.RazorPageName.Length - Constants.ViewExtension.Length; razorGeneratorModel.RazorPageName = razorGeneratorModel.RazorPageName.Substring(0, viewNameLength); } var templateName = razorGeneratorModel.TemplateName + Constants.RazorTemplateExtension; var pageModelTemplateName = razorGeneratorModel.TemplateName + "PageModel" + Constants.RazorTemplateExtension; var pageModelOutputPath = outputPath + ".cs"; await _codeGeneratorActionsService.AddFileFromTemplateAsync(outputPath, templateName, templateFolders, TemplateModel); _logger.LogMessage("Added RazorPage : " + outputPath.Substring(ApplicationInfo.ApplicationBasePath.Length)); if (!razorGeneratorModel.NoPageModel) { await _codeGeneratorActionsService.AddFileFromTemplateAsync(pageModelOutputPath, pageModelTemplateName, templateFolders, TemplateModel); _logger.LogMessage("Added PageModel : " + pageModelOutputPath.Substring(ApplicationInfo.ApplicationBasePath.Length)); } await AddRequiredFiles(razorGeneratorModel); }
internal async Task BaseGenerateViews(IDictionary <string, string> viewsAndTemplates, RazorPageGeneratorModel razorPageGeneratorModel, ModelTypeAndContextModel modelTypeAndContextModel, string baseOutputPath) { if (viewsAndTemplates == null) { throw new ArgumentNullException(nameof(viewsAndTemplates)); } if (razorPageGeneratorModel == null) { throw new ArgumentNullException(nameof(razorPageGeneratorModel)); } if (modelTypeAndContextModel == null) { throw new ArgumentNullException(nameof(modelTypeAndContextModel)); } if (string.IsNullOrEmpty(baseOutputPath)) { baseOutputPath = ApplicationInfo.ApplicationBasePath; } foreach (KeyValuePair <string, string> entry in viewsAndTemplates) { string viewName = entry.Key; string templateName = entry.Value; string outputPath = Path.Combine(baseOutputPath, viewName + Constants.ViewExtension); var pageModelOutputPath = outputPath + ".cs"; bool isLayoutSelected = !razorPageGeneratorModel.PartialView && (razorPageGeneratorModel.UseDefaultLayout || !string.IsNullOrEmpty(razorPageGeneratorModel.LayoutPage)); RazorPageWithContextTemplateModel templateModel = GetRazorPageWithContextTemplateModel(razorPageGeneratorModel, modelTypeAndContextModel); templateModel.RazorPageName = viewName; templateModel.PageModelClassName = viewName + "Model"; var pageModelTemplateName = templateName + "PageModel" + Constants.RazorTemplateExtension; templateName = templateName + Constants.RazorTemplateExtension; await _codeGeneratorActionsService.AddFileFromTemplateAsync(outputPath, templateName, TemplateFolders, templateModel); _logger.LogMessage($"Added Razor Page : {outputPath.Substring(ApplicationInfo.ApplicationBasePath.Length)}"); await _codeGeneratorActionsService.AddFileFromTemplateAsync(pageModelOutputPath, pageModelTemplateName, TemplateFolders, templateModel); _logger.LogMessage($"Added PageModel : {pageModelOutputPath.Substring(ApplicationInfo.ApplicationBasePath.Length)}"); } await AddRequiredFiles(razorPageGeneratorModel); }
protected ViewGeneratorTemplateModel GetViewGeneratorTemplateModel(ViewGeneratorModel viewGeneratorModel, ModelTypeAndContextModel modelTypeAndContextModel) { bool isLayoutSelected = !viewGeneratorModel.PartialView && (viewGeneratorModel.UseDefaultLayout || !String.IsNullOrEmpty(viewGeneratorModel.LayoutPage)); ViewGeneratorTemplateModel templateModel = new ViewGeneratorTemplateModel() { ViewDataTypeName = modelTypeAndContextModel?.ModelType?.FullName, ViewDataTypeShortName = modelTypeAndContextModel?.ModelType?.Name, ViewName = viewGeneratorModel.ViewName, LayoutPageFile = viewGeneratorModel.LayoutPage, IsLayoutPageSelected = isLayoutSelected, IsPartialView = viewGeneratorModel.PartialView, ReferenceScriptLibraries = viewGeneratorModel.ReferenceScriptLibraries, ModelMetadata = modelTypeAndContextModel?.ContextProcessingResult?.ModelMetadata, JQueryVersion = "1.10.2" //Todo }; return(templateModel); }
/// <summary> /// Method exposed for adding multiple views in one operation. /// Utilised by the ControllerWithContextGenerator which generates 5 views for a MVC controller with context. /// </summary> /// <param name="viewsAndTemplates">Names of views and the corresponding template names</param> /// <param name="viewGeneratorModel">Model for View Generator</param> /// <param name="modelTypeAndContextModel">Model Type and DbContext metadata</param> /// <param name="baseOutputPath">Folder where all views will be generated</param> internal async Task GenerateViews(Dictionary <string, string> viewsAndTemplates, ViewGeneratorModel viewGeneratorModel, ModelTypeAndContextModel modelTypeAndContextModel, string baseOutputPath) { if (viewsAndTemplates == null) { throw new ArgumentNullException(nameof(viewsAndTemplates)); } if (viewGeneratorModel == null) { throw new ArgumentNullException(nameof(viewsAndTemplates)); } if (modelTypeAndContextModel == null) { throw new ArgumentNullException(nameof(modelTypeAndContextModel)); } if (string.IsNullOrEmpty(baseOutputPath)) { baseOutputPath = ApplicationInfo.ApplicationBasePath; } foreach (var entry in viewsAndTemplates) { var viewName = entry.Key; var templateName = entry.Value; if (viewName.EndsWith(Constants.ViewExtension, StringComparison.OrdinalIgnoreCase)) { int viewNameLength = viewName.Length - Constants.ViewExtension.Length; viewName = viewName.Substring(0, viewNameLength); } var outputPath = Path.Combine(baseOutputPath, viewName + Constants.ViewExtension); bool isLayoutSelected = !viewGeneratorModel.PartialView && (viewGeneratorModel.UseDefaultLayout || !String.IsNullOrEmpty(viewGeneratorModel.LayoutPage)); var templateModel = GetViewGeneratorTemplateModel(viewGeneratorModel, modelTypeAndContextModel); templateModel.ViewName = viewName; templateName = templateName + Constants.RazorTemplateExtension; await _codeGeneratorActionsService.AddFileFromTemplateAsync(outputPath, templateName, TemplateFolders, templateModel); _logger.LogMessage($"Added View : {outputPath.Substring(ApplicationInfo.ApplicationBasePath.Length)}"); } await AddRequiredFiles(viewGeneratorModel); }