Browse Source

Add create/read/update/delete ASP.NET MVC controller template.

pull/18/head
Matt Ward 15 years ago
parent
commit
b880cd3554
  1. 1
      src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj
  2. 34
      src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddController/Controller.tt
  3. 28
      src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddController/Controller.tt
  4. 50
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectView.xaml
  5. 49
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectViewModel.cs
  6. 1
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcControllerFileGenerator.cs
  7. 2
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHost.cs
  8. 3
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs
  9. 27
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerTemplateViewModel.cs
  10. 2
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHost.cs
  11. 1
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcControllerFileGenerator.cs
  12. 1
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs
  13. 74
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectViewModelTests.cs
  14. 2
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs
  15. 28
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs

1
src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj

@ -76,6 +76,7 @@ @@ -76,6 +76,7 @@
<Compile Include="Src\MvcControllerFileGenerator.cs" />
<Compile Include="Src\MvcControllerFileName.cs" />
<Compile Include="Src\MvcControllerName.cs" />
<Compile Include="Src\MvcControllerTemplateViewModel.cs" />
<Compile Include="Src\MvcControllerTextTemplateFileName.cs" />
<Compile Include="Src\MvcFileGenerator.cs" />
<Compile Include="Src\MvcFileName.cs" />

34
src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddController/Controller.tt

@ -17,5 +17,39 @@ namespace <#= mvcHost.Namespace #> @@ -17,5 +17,39 @@ namespace <#= mvcHost.Namespace #>
{
return View();
}
<# if (mvcHost.AddActionMethods) { #>
public ActionResult Details(int id)
{
return View();
}
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(FormCollection values)
{
return View();
}
public ActionResult Edit(int id)
{
return View();
}
[HttpPost]
public ActionResult Edit(int id, FormCollection values)
{
return View();
}
public ActionResult Delete(int id)
{
return View();
}
<# } #>
}
}

28
src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddController/Controller.tt

@ -16,5 +16,33 @@ Namespace <#= mvcHost.Namespace #> @@ -16,5 +16,33 @@ Namespace <#= mvcHost.Namespace #>
Function Index() As ActionResult
Return View()
End Function
<# If mvcHost.AddActionMethods Then #>
Function Details(ByVal id As Integer) As ActionResult
Return View()
End Function
Function Create() As ActionResult
Return View()
End Function
<AcceptVerbs(HttpVerbs.Post)> _
Function Create(ByVal values As FormCollection) As ActionResult
Return View()
End Function
Function Edit(ByVal id As Integer) As ActionResult
Return View()
End Function
<AcceptVerbs(HttpVerbs.Post)> _
Function Edit(ByVal id As Integer, ByVal values As FormCollection) As ActionResult
Return View()
End Function
Function Delete(ByVal id as Integer) As ActionResult
Return View()
End Function
<# End If #>
End Class
End Namespace

50
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectView.xaml

@ -5,44 +5,60 @@ @@ -5,44 +5,60 @@
xmlns:mvc="clr-namespace:ICSharpCode.AspNet.Mvc"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Add Controller"
Style="{x:Static core:GlobalStyles.DialogWindowStyle}"
Style="{x:Static core:GlobalStyles.DialogWindowStyle}"
mvc:CloseWindowBehaviour.IsClosed="{Binding IsClosed}"
WindowStartupLocation="CenterOwner"
FocusManager.FocusedElement="{Binding ElementName=ControllerNameTextBox}"
Height="400"
Width="400">
Width="500">
<Window.Resources>
<Style TargetType="Button" BasedOn="{x:Static core:GlobalStyles.ButtonStyle}"/>
<DataTemplate x:Key="ControllerTemplate">
<TextBlock Text="{Binding Description}"/>
</DataTemplate>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock
Margin="4"
Text="Controller Name:"/>
<TextBox
x:Name="ControllerNameTextBox"
Grid.Column="1"
Text="{Binding Path=ControllerName, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
<TextBlock
Margin="4"
Text="Controller Name:"/>
<TextBox
x:Name="ControllerNameTextBox"
Grid.Column="1"
Text="{Binding Path=ControllerName, UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock
Grid.Row="1"
Margin="4"
Text="Template:"/>
<ComboBox
Margin="2"
Grid.Column="1"
Grid.Row="1"
ItemsSource="{Binding Path=ControllerTemplates}"
ItemTemplate="{StaticResource ControllerTemplate}"
SelectedItem="{Binding Path=SelectedControllerTemplate}"/>
<StackPanel
Orientation="Horizontal"
HorizontalAlignment="Right"
Margin="4"
Grid.Row="2">
Grid.Column="0"
Grid.ColumnSpan="2"
Grid.Row="3">
<Button
Margin="2, 0"
Content="_Add"

49
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcControllerToProjectViewModel.cs

@ -2,7 +2,9 @@ @@ -2,7 +2,9 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Windows.Input;
using ICSharpCode.AspNet.Mvc;
namespace ICSharpCode.AspNet.Mvc
@ -14,6 +16,7 @@ namespace ICSharpCode.AspNet.Mvc @@ -14,6 +16,7 @@ namespace ICSharpCode.AspNet.Mvc
IMvcFileService fileService;
MvcControllerFileName controllerFileName = new MvcControllerFileName();
bool closed;
List<MvcControllerTemplateViewModel> controllerTemplates;
public AddMvcControllerToProjectViewModel(ISelectedMvcFolder selectedControllerFolder)
: this(
@ -36,6 +39,7 @@ namespace ICSharpCode.AspNet.Mvc @@ -36,6 +39,7 @@ namespace ICSharpCode.AspNet.Mvc
SetLanguageForFileGeneration();
CreateCommands();
AddControllerTemplates();
}
void SetLanguageForFileGeneration()
@ -70,6 +74,50 @@ namespace ICSharpCode.AspNet.Mvc @@ -70,6 +74,50 @@ namespace ICSharpCode.AspNet.Mvc
}
}
public IEnumerable<MvcControllerTemplateViewModel> ControllerTemplates {
get { return controllerTemplates; }
}
public MvcControllerTemplateViewModel SelectedControllerTemplate { get; set; }
void AddControllerTemplates()
{
controllerTemplates = new List<MvcControllerTemplateViewModel>();
AddEmptyControllerTemplate();
AddEmptyReadWriteControllerTemplate();
SelectEmptyControllerTemplate();
}
void AddEmptyReadWriteControllerTemplate()
{
var template = new MvcControllerTemplateViewModel() {
Name = "EmptyReadWrite",
Description = "Controller with create, read, update and delete actions",
AddActionMethods = true
};
AddControllerTemplate(template);
}
void AddEmptyControllerTemplate()
{
var template = new MvcControllerTemplateViewModel() {
Name = "Empty",
Description = "Empty controller",
AddActionMethods = false
};
AddControllerTemplate(template);
}
void AddControllerTemplate(MvcControllerTemplateViewModel template)
{
controllerTemplates.Add(template);
}
void SelectEmptyControllerTemplate()
{
SelectedControllerTemplate = controllerTemplates[0];
}
public bool CanAddMvcController()
{
return controllerFileName.HasValidControllerName();
@ -91,6 +139,7 @@ namespace ICSharpCode.AspNet.Mvc @@ -91,6 +139,7 @@ namespace ICSharpCode.AspNet.Mvc
void ConfigureMvcControllerGenerator()
{
controllerGenerator.AddActionMethods = SelectedControllerTemplate.AddActionMethods;
controllerGenerator.Project = selectedControllerFolder.Project;
}

1
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcControllerFileGenerator.cs

@ -10,6 +10,7 @@ namespace ICSharpCode.AspNet.Mvc @@ -10,6 +10,7 @@ namespace ICSharpCode.AspNet.Mvc
{
MvcTextTemplateLanguage TemplateLanguage { get; set; }
IProject Project { get; set; }
bool AddActionMethods { get; set; }
void GenerateFile(MvcControllerFileName fileName);
}

2
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHost.cs

@ -14,6 +14,8 @@ namespace ICSharpCode.AspNet.Mvc @@ -14,6 +14,8 @@ namespace ICSharpCode.AspNet.Mvc
string ControllerRootName { get; set; }
string Namespace { get; set; }
bool AddActionMethods { get; set; }
bool ProcessTemplate(string inputFile, string outputFile);
CompilerErrorCollection Errors { get; }

3
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerFileGenerator.cs

@ -25,6 +25,8 @@ namespace ICSharpCode.AspNet.Mvc @@ -25,6 +25,8 @@ namespace ICSharpCode.AspNet.Mvc
this.textTemplateRepository = textTemplateRepository;
}
public bool AddActionMethods { get; set; }
public void GenerateFile(MvcControllerFileName fileName)
{
base.GenerateFile(fileName);
@ -34,6 +36,7 @@ namespace ICSharpCode.AspNet.Mvc @@ -34,6 +36,7 @@ namespace ICSharpCode.AspNet.Mvc
{
var controllerFileName = fileName as MvcControllerFileName;
host.ControllerName = controllerFileName.ControllerName;
host.AddActionMethods = AddActionMethods;
host.Namespace = GetNamespace();
}

27
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcControllerTemplateViewModel.cs

@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
namespace ICSharpCode.AspNet.Mvc
{
public class MvcControllerTemplateViewModel
{
public MvcControllerTemplateViewModel()
: this(String.Empty, String.Empty)
{
}
public MvcControllerTemplateViewModel(
string name,
string description)
{
this.Name = name;
this.Description = description;
}
public string Name { get; set; }
public string Description { get; set; }
public bool AddActionMethods { get; set; }
}
}

2
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHost.cs

@ -60,5 +60,7 @@ namespace ICSharpCode.AspNet.Mvc @@ -60,5 +60,7 @@ namespace ICSharpCode.AspNet.Mvc
get { return @namespace; }
set { @namespace = UseEmptyStringIfNull(value); }
}
public bool AddActionMethods { get; set; }
}
}

1
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcControllerFileGenerator.cs

@ -11,6 +11,7 @@ namespace AspNet.Mvc.Tests.Helpers @@ -11,6 +11,7 @@ namespace AspNet.Mvc.Tests.Helpers
{
public MvcTextTemplateLanguage TemplateLanguage { get; set; }
public IProject Project { get; set; }
public bool AddActionMethods { get; set; }
public bool IsGenerateFileCalled;
public MvcControllerFileName FileNamePassedToGenerateController;

1
src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs

@ -36,6 +36,7 @@ namespace AspNet.Mvc.Tests.Helpers @@ -36,6 +36,7 @@ namespace AspNet.Mvc.Tests.Helpers
public string ControllerName { get; set; }
public string ControllerRootName { get; set; }
public string Namespace { get; set; }
public bool AddActionMethods { get; set; }
public CompilerErrorCollection Errors { get; set; }
}

74
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcControllerToProjectViewModelTests.cs

@ -3,6 +3,8 @@ @@ -3,6 +3,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using AspNet.Mvc.Tests.Helpers;
using ICSharpCode.AspNet.Mvc;
using ICSharpCode.SharpDevelop.Project;
@ -54,6 +56,26 @@ namespace AspNet.Mvc.Tests @@ -54,6 +56,26 @@ namespace AspNet.Mvc.Tests
viewModel.PropertyChanged += (source, e) => propertyChangedEvents.Add(e.PropertyName);
}
bool ViewModelHasControllerTemplate(string templateName)
{
return viewModel.ControllerTemplates.Any(v => v.Name == templateName);
}
MvcControllerTemplateViewModel GetControllerTemplateFromViewModel(string templateName)
{
return viewModel.ControllerTemplates.SingleOrDefault(v => v.Name == templateName);
}
void SelectEmptyControllerTemplate()
{
viewModel.SelectedControllerTemplate = GetControllerTemplateFromViewModel("Empty");
}
void SelectEmptyReadWriteControllerTemplate()
{
viewModel.SelectedControllerTemplate = GetControllerTemplateFromViewModel("EmptyReadWrite");
}
[Test]
public void AddMvcControllerCommand_ExecutedWhenControllerNameSpecified_MvcControllerIsGenerated()
{
@ -217,5 +239,57 @@ namespace AspNet.Mvc.Tests @@ -217,5 +239,57 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(expectedFileNameOpened, fileNameOpened);
}
[Test]
public void ControllerTemplates_DefaultTemplates_HasEmptyControllerTemplate()
{
CreateViewModelWithCSharpProject();
bool contains = ViewModelHasControllerTemplate("Empty");
Assert.IsTrue(contains);
}
[Test]
public void ControllerTemplates_DefaultTemplates_HasEmptyReadWriteControllerTemplate()
{
CreateViewModelWithCSharpProject();
bool contains = ViewModelHasControllerTemplate("EmptyReadWrite");
Assert.IsTrue(contains);
}
[Test]
public void SelectedControllerTemplate_DefaultTemplates_EmptyControllerTemplateIsSelectedByDefault()
{
CreateViewModelWithCSharpProject();
MvcControllerTemplateViewModel controllerTemplate = viewModel.SelectedControllerTemplate;
Assert.AreEqual("Empty", controllerTemplate.Name);
}
[Test]
public void AddMvcController_EmptyReadWriteTemplateSelected_AddActionMethodsSetToTrueOnFileGenerator()
{
CreateViewModelWithCSharpProject();
SelectEmptyReadWriteControllerTemplate();
fakeControllerGenerator.AddActionMethods = false;
viewModel.AddMvcController();
Assert.IsTrue(fakeControllerGenerator.AddActionMethods);
}
[Test]
public void AddMvcController_EmptyTemplateSelected_AddActionMethodsSetToFalseOnFileGenerator()
{
CreateViewModelWithCSharpProject();
SelectEmptyControllerTemplate();
fakeControllerGenerator.AddActionMethods = true;
viewModel.AddMvcController();
Assert.IsFalse(fakeControllerGenerator.AddActionMethods);
}
}
}

2
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs

@ -234,7 +234,7 @@ namespace AspNet.Mvc.Tests @@ -234,7 +234,7 @@ namespace AspNet.Mvc.Tests
}
[Test]
public void ViewTypes_RazorAndAspxViewEngines_RazorViewEngineViewModelHasRazorTemplateType()
public void ViewEngines_RazorAndAspxViewEngines_RazorViewEngineViewModelHasRazorTemplateType()
{
CreateViewModel();

28
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcControllerFileGeneratorTests.cs

@ -153,5 +153,33 @@ namespace AspNet.Mvc.Tests @@ -153,5 +153,33 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(expectedNamespace, fakeHost.Namespace);
}
[Test]
public void GenerateFile_AddActionMethodsIsTrue_MvcTextTemplateHostAddActionMethodsIsTrue()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
generator.AddActionMethods = true;
GenerateFile();
bool addActionMethods = fakeHost.AddActionMethods;
Assert.IsTrue(addActionMethods);
}
[Test]
public void GenerateFile_AddActionMethodsIsFalse_MvcTextTemplateHostAddActionMethodsIsFalse()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
generator.AddActionMethods = false;
GenerateFile();
bool addActionMethods = fakeHost.AddActionMethods;
Assert.IsFalse(addActionMethods);
}
}
}

Loading…
Cancel
Save