Browse Source

Support creating partial views from ASP.NET MVC Add View dialog.

pull/18/head
Matt Ward 14 years ago
parent
commit
8f72cb49ff
  1. 6
      src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Empty.tt
  2. 4
      src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Empty.tt
  3. 6
      src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/AspxVisualBasic/Empty.tt
  4. 4
      src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/VBHTML/Empty.tt
  5. 13
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectView.xaml
  6. 5
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs
  7. 8
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IMvcTextTemplateHost.cs
  8. 13
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateFileNameExtension.cs
  9. 1
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateHost.cs
  10. 1
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileGenerator.cs
  11. 5
      src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileName.cs
  12. 1
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Helpers/FakeMvcTextTemplateHost.cs
  13. 26
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/AddMvcViewToProjectViewModelTests.cs
  14. 56
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs
  15. 16
      src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileNameTests.cs

6
src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/AspxCSharp/Empty.tt

@ -1,8 +1,11 @@
<#@ template language="C#" HostSpecific="true" #> <#@ template language="C#" HostSpecific="true" #>
<#@ output extension=".aspx" #>
<# <#
MvcTextTemplateHost mvcHost = (MvcTextTemplateHost)Host; MvcTextTemplateHost mvcHost = (MvcTextTemplateHost)Host;
#> #>
<# if (mvcHost.IsPartialView) { #>
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<# } else { #>
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<!DOCTYPE html> <!DOCTYPE html>
@ -16,3 +19,4 @@
</div> </div>
</body> </body>
</html> </html>
<# } #>

4
src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/CSharp/CodeTemplates/AddView/CSHTML/Empty.tt

@ -3,6 +3,9 @@
<# <#
MvcTextTemplateHost mvcHost = (MvcTextTemplateHost)Host; MvcTextTemplateHost mvcHost = (MvcTextTemplateHost)Host;
#> #>
<# if (mvcHost.IsPartialView) { #>
<# } else { #>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
@ -15,3 +18,4 @@
</div> </div>
</body> </body>
</html> </html>
<# } #>

6
src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/AspxVisualBasic/Empty.tt

@ -1,8 +1,11 @@
<#@ template language="VB" HostSpecific="true" #> <#@ template language="VB" HostSpecific="true" #>
<#@ output extension=".aspx" #>
<# <#
Dim mvcHost As MvcTextTemplateHost = DirectCast(Host, MvcTextTemplateHost) Dim mvcHost As MvcTextTemplateHost = DirectCast(Host, MvcTextTemplateHost)
#> #>
<# If mvcHost.IsPartialView Then #>
<%@ Control Language="VB" Inherits="System.Web.Mvc.ViewUserControl" %>
<# Else #>
<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage" %> <%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage" %>
<!DOCTYPE html> <!DOCTYPE html>
@ -16,3 +19,4 @@
</div> </div>
</body> </body>
</html> </html>
<# End If #>

4
src/AddIns/BackendBindings/AspNet.Mvc/Project/ItemTemplates/VisualBasic/CodeTemplates/AddView/VBHTML/Empty.tt

@ -3,6 +3,9 @@
<# <#
Dim mvcHost As MvcTextTemplateHost = DirectCast(Host, MvcTextTemplateHost) Dim mvcHost As MvcTextTemplateHost = DirectCast(Host, MvcTextTemplateHost)
#> #>
<# If mvcHost.IsPartialView Then #>
<# Else #>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
@ -15,3 +18,4 @@
</div> </div>
</body> </body>
</html> </html>
<# End If #>

13
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectView.xaml

@ -22,6 +22,7 @@
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="*"/> <RowDefinition Height="*"/>
@ -54,12 +55,22 @@
ItemTemplate="{StaticResource ViewEngineTemplate}" ItemTemplate="{StaticResource ViewEngineTemplate}"
SelectedItem="{Binding Path=SelectedViewEngine}"/> SelectedItem="{Binding Path=SelectedViewEngine}"/>
<TextBlock
Grid.Row="2"
Margin="4"
Text="Partial View:"/>
<CheckBox
Grid.Column="1"
Grid.Row="2"
Margin="2, 4, 0, 0"
IsChecked="{Binding Path=IsPartialView}"/>
<StackPanel <StackPanel
Orientation="Horizontal" Orientation="Horizontal"
HorizontalAlignment="Right" HorizontalAlignment="Right"
Margin="4" Margin="4"
Grid.ColumnSpan="2" Grid.ColumnSpan="2"
Grid.Row="3"> Grid.Row="4">
<Button <Button
Margin="2, 0" Margin="2, 0"
Content="_Add" Content="_Add"

5
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/AddMvcViewToProjectViewModel.cs

@ -145,6 +145,11 @@ namespace ICSharpCode.AspNet.Mvc
string path = viewFileName.GetPath(); string path = viewFileName.GetPath();
fileService.OpenFile(path); fileService.OpenFile(path);
} }
public bool IsPartialView {
get { return viewFileName.IsPartialView; }
set { viewFileName.IsPartialView = value; }
}
} }
} }

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

@ -9,11 +9,15 @@ namespace ICSharpCode.AspNet.Mvc
{ {
public interface IMvcTextTemplateHost : IDisposable public interface IMvcTextTemplateHost : IDisposable
{ {
string Namespace { get; set; }
// Add View properties.
string ViewName { get; set; } string ViewName { get; set; }
bool IsPartialView { get; set; }
// Add Controller properties.
string ControllerName { get; set; } string ControllerName { get; set; }
string ControllerRootName { get; set; } string ControllerRootName { get; set; }
string Namespace { get; set; }
bool AddActionMethods { get; set; } bool AddActionMethods { get; set; }
bool ProcessTemplate(string inputFile, string outputFile); bool ProcessTemplate(string inputFile, string outputFile);

13
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcTextTemplateFileNameExtension.cs

@ -17,14 +17,23 @@ namespace ICSharpCode.AspNet.Mvc
public static string GetViewFileExtension( public static string GetViewFileExtension(
MvcTextTemplateType type, MvcTextTemplateType type,
MvcTextTemplateLanguage language) MvcTextTemplateLanguage language,
bool isPartialView)
{ {
if (type.IsAspx()) { if (type.IsAspx()) {
return ".aspx"; return GetAspxFileExtension(isPartialView);
} }
return GetRazorFileExtension(language); return GetRazorFileExtension(language);
} }
static string GetAspxFileExtension(bool isPartialView)
{
if (isPartialView) {
return ".ascx";
}
return ".aspx";
}
public static string GetRazorFileExtension(MvcTextTemplateLanguage language) public static string GetRazorFileExtension(MvcTextTemplateLanguage language)
{ {
if (language.IsVisualBasic()) { if (language.IsVisualBasic()) {

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

@ -62,5 +62,6 @@ namespace ICSharpCode.AspNet.Mvc
} }
public bool AddActionMethods { get; set; } public bool AddActionMethods { get; set; }
public bool IsPartialView { get; set; }
} }
} }

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

@ -36,6 +36,7 @@ namespace ICSharpCode.AspNet.Mvc
{ {
var viewFileName = fileName as MvcViewFileName; var viewFileName = fileName as MvcViewFileName;
host.ViewName = viewFileName.ViewName; host.ViewName = viewFileName.ViewName;
host.IsPartialView = viewFileName.IsPartialView;
} }
protected override string GetTextTemplateFileName() protected override string GetTextTemplateFileName()

5
src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/MvcViewFileName.cs

@ -25,6 +25,7 @@ namespace ICSharpCode.AspNet.Mvc
public MvcTextTemplateType TemplateType { get; set; } public MvcTextTemplateType TemplateType { get; set; }
public MvcTextTemplateLanguage TemplateLanguage { get; set; } public MvcTextTemplateLanguage TemplateLanguage { get; set; }
public bool IsPartialView { get; set; }
public override string GetFileName() public override string GetFileName()
{ {
@ -43,7 +44,9 @@ namespace ICSharpCode.AspNet.Mvc
string GetViewFileExtension() string GetViewFileExtension()
{ {
return MvcTextTemplateFileNameExtension.GetViewFileExtension(TemplateType, TemplateLanguage); return
MvcTextTemplateFileNameExtension
.GetViewFileExtension(TemplateType, TemplateLanguage, IsPartialView);
} }
public bool HasValidViewName() public bool HasValidViewName()

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

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

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

@ -344,5 +344,31 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(MvcTextTemplateType.Aspx, templateType); Assert.AreEqual(MvcTextTemplateType.Aspx, templateType);
} }
[Test]
public void AddMvcView_CreateAsPartialViewIsSelected_ViewFileIsPartialView()
{
CreateViewModel();
CSharpProjectSelected();
viewModel.IsPartialView = true;
viewModel.AddMvcView();
bool partialView = fakeViewGenerator.FileNamePassedToGenerateFile.IsPartialView;
Assert.IsTrue(partialView);
}
[Test]
public void AddMvcView_CreateAsPartialViewIsNotSelected_ViewFileIsNotPartialView()
{
CreateViewModel();
CSharpProjectSelected();
viewModel.IsPartialView = false;
viewModel.AddMvcView();
bool partialView = fakeViewGenerator.FileNamePassedToGenerateFile.IsPartialView;
Assert.IsFalse(partialView);
}
} }
} }

56
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileGeneratorTests.cs

@ -61,11 +61,17 @@ namespace AspNet.Mvc.Tests
} }
void GenerateFile(string folder, string name) void GenerateFile(string folder, string name)
{
MvcViewFileName fileName = CreateMvcViewFileName(folder, name);
GenerateFile(fileName);
}
MvcViewFileName CreateMvcViewFileName(string folder, string name)
{ {
var fileName = new MvcViewFileName(); var fileName = new MvcViewFileName();
fileName.Folder = folder; fileName.Folder = folder;
fileName.ViewName = name; fileName.ViewName = name;
GenerateFile(fileName); return fileName;
} }
void GenerateFile(MvcViewFileName fileName) void GenerateFile(MvcViewFileName fileName)
@ -161,5 +167,53 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(expectedInputFileName, inputFileName); Assert.AreEqual(expectedInputFileName, inputFileName);
} }
[Test]
public void GenerateFile_IsPartialViewIsTrue_MvcTextTemplateHostIsPartialViewIsSetToTrue()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
string viewFolder = @"d:\projects\MyProject\Views\Home";
string viewName = "Index";
MvcViewFileName fileName = CreateMvcViewFileName(viewFolder, viewName);
fileName.IsPartialView = true;
GenerateFile(fileName);
Assert.IsTrue(fakeHost.IsPartialView);
}
[Test]
public void GenerateFile_IsPartialViewIsFalse_MvcTextTemplateHostIsPartialViewIsSetToFalse()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
string viewFolder = @"d:\projects\MyProject\Views\Home";
string viewName = "Index";
MvcViewFileName fileName = CreateMvcViewFileName(viewFolder, viewName);
fileName.IsPartialView = false;
GenerateFile(fileName);
Assert.IsFalse(fakeHost.IsPartialView);
}
[Test]
public void GenerateFile_CSharpEmptyAspxViewTemplateAndIsPartialViewIsSet_AspxUserControlFileGenerated()
{
CreateGenerator();
ProjectPassedToGeneratorIsCSharpProject();
SelectAspxTemplate();
string viewFolder = @"d:\projects\MyProject\Views\Home";
string viewName = "Index";
MvcViewFileName fileName = CreateMvcViewFileName(viewFolder, viewName);
fileName.IsPartialView = true;
GenerateFile(fileName);
string outputFileGenerated = fakeHost.OutputFilePassedToProcessTemplate;
string expectedOutputFileGenerated =
@"d:\projects\MyProject\Views\Home\Index.ascx";
Assert.AreEqual(expectedOutputFileGenerated, outputFileGenerated);
}
} }
} }

16
src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/MvcViewFileNameTests.cs

@ -124,5 +124,21 @@ namespace AspNet.Mvc.Tests
Assert.AreEqual(expectedFileName, fileName); Assert.AreEqual(expectedFileName, fileName);
} }
[Test]
public void GetPath_CSharpAspxTemplateWithIsPartial_ReturnsCSharpUserControlFileName()
{
CreateFileName();
mvcViewFileName.TemplateType = MvcTextTemplateType.Aspx;
mvcViewFileName.TemplateLanguage = MvcTextTemplateLanguage.CSharp;
mvcViewFileName.ViewName = "Index";
mvcViewFileName.Folder = @"d:\projects\MyAspProject\Views\About";
mvcViewFileName.IsPartialView = true;
string fileName = mvcViewFileName.GetPath();
string expectedFileName = @"d:\projects\MyAspProject\Views\About\Index.ascx";
Assert.AreEqual(expectedFileName, fileName);
}
} }
} }

Loading…
Cancel
Save