[T4Scaffolding.ControllerScaffolder("Controller with read/write action and views, using EF data access code", Description = "Adds an ASP.NET MVC controller with views and data access code", SupportsModelType = $true, SupportsDataContextType = $true, SupportsViewScaffolder = $true)][CmdletBinding()] param( [parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)][string]$ControllerName, [string]$ModelType, [string]$Project, [string]$CodeLanguage, [string]$DbContextType, [string]$Area, [string]$ViewScaffolder = "View", [alias("MasterPage")]$Layout, [alias("ContentPlaceholderIDs")][string[]]$SectionNames, [alias("PrimaryContentPlaceholderID")][string]$PrimarySectionName, [switch]$ReferenceScriptLibraries = $false, [switch]$Repository = $false, [switch]$NoChildItems = $false, [string[]]$TemplateFolders, [switch]$Force = $false, [string]$ForceMode ) # Interpret the "Force" and "ForceMode" options $overwriteController = $Force -and ((!$ForceMode) -or ($ForceMode -eq "ControllerOnly")) $overwriteFilesExceptController = $Force -and ((!$ForceMode) -or ($ForceMode -eq "PreserveController")) # Ensure you've referenced System.Data.Entity (Get-Project $Project).Object.References.Add("System.Data.Entity") | Out-Null # If you haven't specified a model type, we'll guess from the controller name if (!$ModelType) { if ($ControllerName.EndsWith("Controller", [StringComparison]::OrdinalIgnoreCase)) { # If you've given "PeopleController" as the full controller name, we're looking for a model called People or Person $ModelType = [System.Text.RegularExpressions.Regex]::Replace($ControllerName, "Controller$", "", [System.Text.RegularExpressions.RegexOptions]::IgnoreCase) $foundModelType = Get-ProjectType $ModelType -Project $Project -BlockUi -ErrorAction SilentlyContinue if (!$foundModelType) { $ModelType = [string](Get-SingularizedWord $ModelType) $foundModelType = Get-ProjectType $ModelType -Project $Project -BlockUi -ErrorAction SilentlyContinue } } else { # If you've given "people" as the controller name, we're looking for a model called People or Person, and the controller will be PeopleController $ModelType = $ControllerName $foundModelType = Get-ProjectType $ModelType -Project $Project -BlockUi -ErrorAction SilentlyContinue if (!$foundModelType) { $ModelType = [string](Get-SingularizedWord $ModelType) $foundModelType = Get-ProjectType $ModelType -Project $Project -BlockUi -ErrorAction SilentlyContinue } if ($foundModelType) { $ControllerName = [string](Get-PluralizedWord $foundModelType.Name) + "Controller" } } if (!$foundModelType) { throw "Cannot find a model type corresponding to a controller called '$ControllerName'. Try supplying a -ModelType parameter value." } } else { # If you have specified a model type $foundModelType = Get-ProjectType $ModelType -Project $Project -BlockUi if (!$foundModelType) { return } if (!$ControllerName.EndsWith("Controller", [StringComparison]::OrdinalIgnoreCase)) { $ControllerName = $ControllerName + "Controller" } } Write-Host "Scaffolding $ControllerName..." if(!$DbContextType) { $DbContextType = [System.Text.RegularExpressions.Regex]::Replace((Get-Project $Project).Name, "[^a-zA-Z0-9]", "") + "Context" } if (!$NoChildItems) { if ($Repository) { Scaffold Repository -ModelType $foundModelType.FullName -DbContextType $DbContextType -Area $Area -Project $Project -CodeLanguage $CodeLanguage -Force:$overwriteFilesExceptController -BlockUi } else { $dbContextScaffolderResult = Scaffold DbContext -ModelType $foundModelType.FullName -DbContextType $DbContextType -Area $Area -Project $Project -CodeLanguage $CodeLanguage -BlockUi $foundDbContextType = $dbContextScaffolderResult.DbContextType if (!$foundDbContextType) { return } } } if (!$foundDbContextType) { $foundDbContextType = Get-ProjectType $DbContextType -Project $Project } if (!$foundDbContextType) { return } $primaryKey = Get-PrimaryKey $foundModelType.FullName -Project $Project -ErrorIfNotFound if (!$primaryKey) { return } $outputPath = Join-Path Controllers $ControllerName # We don't create areas here, so just ensure that if you specify one, it already exists if ($Area) { $areaPath = Join-Path Areas $Area if (-not (Get-ProjectItem $areaPath -Project $Project)) { Write-Error "Cannot find area '$Area'. Make sure it exists already." return } $outputPath = Join-Path $areaPath $outputPath } # Prepare all the parameter values to pass to the template, then invoke the template with those values $repositoryName = $foundModelType.Name + "Repository" $defaultNamespace = (Get-Project $Project).Properties.Item("DefaultNamespace").Value $modelTypeNamespace = [T4Scaffolding.Namespaces]::GetNamespace($foundModelType.FullName) $controllerNamespace = [T4Scaffolding.Namespaces]::Normalize($defaultNamespace + "." + [System.IO.Path]::GetDirectoryName($outputPath).Replace([System.IO.Path]::DirectorySeparatorChar, ".")) $areaNamespace = if ($Area) { [T4Scaffolding.Namespaces]::Normalize($defaultNamespace + ".Areas.$Area") } else { $defaultNamespace } $dbContextNamespace = $foundDbContextType.Namespace.FullName $repositoriesNamespace = [T4Scaffolding.Namespaces]::Normalize($areaNamespace + ".Models") $modelTypePluralized = Get-PluralizedWord $foundModelType.Name $relatedEntities = [Array](Get-RelatedEntities $foundModelType.FullName -Project $project) if (!$relatedEntities) { $relatedEntities = @() } $templateName = if($Repository) { "ControllerWithRepository" } else { "ControllerWithContext" } Add-ProjectItemViaTemplate $outputPath -Template $templateName -Model @{ ControllerName = $ControllerName; ModelType = [MarshalByRefObject]$foundModelType; PrimaryKey = [string]$primaryKey; DefaultNamespace = $defaultNamespace; AreaNamespace = $areaNamespace; DbContextNamespace = $dbContextNamespace; RepositoriesNamespace = $repositoriesNamespace; ModelTypeNamespace = $modelTypeNamespace; ControllerNamespace = $controllerNamespace; DbContextType = [MarshalByRefObject]$foundDbContextType; Repository = $repositoryName; ModelTypePluralized = [string]$modelTypePluralized; RelatedEntities = $relatedEntities; } -SuccessMessage "Added controller {0}" -TemplateFolders $TemplateFolders -Project $Project -CodeLanguage $CodeLanguage -Force:$overwriteController if (!$NoChildItems) { $controllerNameWithoutSuffix = [System.Text.RegularExpressions.Regex]::Replace($ControllerName, "Controller$", "", [System.Text.RegularExpressions.RegexOptions]::IgnoreCase) if ($ViewScaffolder) { Scaffold Views -ViewScaffolder $ViewScaffolder -Controller $controllerNameWithoutSuffix -ModelType $foundModelType.FullName -Area $Area -Layout $Layout -SectionNames $SectionNames -PrimarySectionName $PrimarySectionName -ReferenceScriptLibraries:$ReferenceScriptLibraries -Project $Project -CodeLanguage $CodeLanguage -Force:$overwriteFilesExceptController } }