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

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

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

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

@ -1,8 +1,11 @@ @@ -1,8 +1,11 @@
<#@ template language="VB" HostSpecific="true" #>
<#@ output extension=".aspx" #>
<#
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" %>
<!DOCTYPE html>
@ -16,3 +19,4 @@ @@ -16,3 +19,4 @@
</div>
</body>
</html>
<# End If #>

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

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

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

@ -22,6 +22,7 @@ @@ -22,6 +22,7 @@
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
@ -54,12 +55,22 @@ @@ -54,12 +55,22 @@
ItemTemplate="{StaticResource ViewEngineTemplate}"
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
Orientation="Horizontal"
HorizontalAlignment="Right"
Margin="4"
Grid.ColumnSpan="2"
Grid.Row="3">
Grid.Row="4">
<Button
Margin="2, 0"
Content="_Add"

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

@ -145,6 +145,11 @@ namespace ICSharpCode.AspNet.Mvc @@ -145,6 +145,11 @@ namespace ICSharpCode.AspNet.Mvc
string path = viewFileName.GetPath();
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 @@ -9,11 +9,15 @@ namespace ICSharpCode.AspNet.Mvc
{
public interface IMvcTextTemplateHost : IDisposable
{
string Namespace { get; set; }
// Add View properties.
string ViewName { get; set; }
bool IsPartialView { get; set; }
// Add Controller properties.
string ControllerName { get; set; }
string ControllerRootName { get; set; }
string Namespace { get; set; }
bool AddActionMethods { get; set; }
bool ProcessTemplate(string inputFile, string outputFile);

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

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

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

@ -62,5 +62,6 @@ namespace ICSharpCode.AspNet.Mvc @@ -62,5 +62,6 @@ namespace ICSharpCode.AspNet.Mvc
}
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 @@ -36,6 +36,7 @@ namespace ICSharpCode.AspNet.Mvc
{
var viewFileName = fileName as MvcViewFileName;
host.ViewName = viewFileName.ViewName;
host.IsPartialView = viewFileName.IsPartialView;
}
protected override string GetTextTemplateFileName()

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

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

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

@ -37,6 +37,7 @@ namespace AspNet.Mvc.Tests.Helpers @@ -37,6 +37,7 @@ namespace AspNet.Mvc.Tests.Helpers
public string ControllerRootName { get; set; }
public string Namespace { get; set; }
public bool AddActionMethods { get; set; }
public bool IsPartialView { 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 @@ -344,5 +344,31 @@ namespace AspNet.Mvc.Tests
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 @@ -61,11 +61,17 @@ namespace AspNet.Mvc.Tests
}
void GenerateFile(string folder, string name)
{
MvcViewFileName fileName = CreateMvcViewFileName(folder, name);
GenerateFile(fileName);
}
MvcViewFileName CreateMvcViewFileName(string folder, string name)
{
var fileName = new MvcViewFileName();
fileName.Folder = folder;
fileName.ViewName = name;
GenerateFile(fileName);
return fileName;
}
void GenerateFile(MvcViewFileName fileName)
@ -161,5 +167,53 @@ namespace AspNet.Mvc.Tests @@ -161,5 +167,53 @@ namespace AspNet.Mvc.Tests
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 @@ -124,5 +124,21 @@ namespace AspNet.Mvc.Tests
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