122 lines
6.8 KiB
PowerShell
122 lines
6.8 KiB
PowerShell
[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
|
|
}
|
|
} |