Skip to content
This repository has been archived by the owner on Dec 14, 2018. It is now read-only.

Commit

Permalink
Update default Razor search paths to include ~/[PagesRoot]/Shared
Browse files Browse the repository at this point in the history
Fixes #6604
  • Loading branch information
pranavkm committed Sep 7, 2017
1 parent 717f1e6 commit 2b8b243
Show file tree
Hide file tree
Showing 4 changed files with 171 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ public class RazorViewEngineOptions
/// /Pages/Account/{0}.cshtml
/// /Pages/{0}.cshtml
/// /Views/Shared/{0}.cshtml
/// /Pages/Shared/{0}.cshtml
/// </para>
/// </remarks>
public IList<string> PageViewLocationFormats { get; } = new List<string>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
Expand All @@ -10,29 +11,45 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
{
public class RazorPagesRazorViewEngineOptionsSetup : IConfigureOptions<RazorViewEngineOptions>
{
private readonly IOptions<RazorPagesOptions> _pagesOptions;
private readonly RazorPagesOptions _pagesOptions;

public RazorPagesRazorViewEngineOptionsSetup(IOptions<RazorPagesOptions> pagesOptions)
{
_pagesOptions = pagesOptions;
_pagesOptions = pagesOptions?.Value ?? throw new ArgumentNullException(nameof(pagesOptions));
}

public void Configure(RazorViewEngineOptions options)
{
Debug.Assert(_pagesOptions.Value.RootDirectory.Length > 0);

if (_pagesOptions.Value.RootDirectory == "/")
{
options.PageViewLocationFormats.Add("/{1}/{0}" + RazorViewEngine.ViewExtension);
}
else
if (options == null)
{
options.PageViewLocationFormats.Add(_pagesOptions.Value.RootDirectory + "/{1}/{0}" + RazorViewEngine.ViewExtension);
throw new ArgumentNullException(nameof(options));
}

var rootDirectory = _pagesOptions.RootDirectory;
Debug.Assert(!string.IsNullOrEmpty(rootDirectory));
var defaultPageSearchPath = CombinePath(rootDirectory, "{1}/{0}");
options.PageViewLocationFormats.Add(defaultPageSearchPath);

// /Pages/Shared/{0}.cshtml
var pagesSharedDirectory = CombinePath(rootDirectory, "Shared/{0}");
options.PageViewLocationFormats.Add(pagesSharedDirectory);

options.PageViewLocationFormats.Add("/Views/Shared/{0}" + RazorViewEngine.ViewExtension);

options.ViewLocationFormats.Add(pagesSharedDirectory);
options.AreaViewLocationFormats.Add(pagesSharedDirectory);

options.ViewLocationExpanders.Add(new PageViewLocationExpander());
}

private static string CombinePath(string path1, string path2)
{
if (path1.EndsWith("/", StringComparison.Ordinal))
{
return path1 + path2 + RazorViewEngine.ViewExtension;
}

return path1 + "/" + path2 + RazorViewEngine.ViewExtension;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1990,6 +1990,7 @@ private static IOptions<RazorViewEngineOptions> GetOptionsAccessor(
var options = new RazorViewEngineOptions();
optionsSetup.Configure(options);
options.PageViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
options.PageViewLocationFormats.Add("/Pages/Shared/{0}.cshtml");

if (expanders != null)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.Razor.Internal;
using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
using Moq;
using Xunit;

namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
{
public class RazorPagesRazorViewEngineOptionsSetupTest
{
[Fact]
public void Configure_AddsPageViewLocationFormats_WhenPagesRootIsAppRoot()
{
// Arrange
var expected = new[]
{
"/{1}/{0}.cshtml",
"/Shared/{0}.cshtml",
"/Views/Shared/{0}.cshtml",
};

var razorPagesOptions = new RazorPagesOptions
{
RootDirectory = "/"
};
var viewEngineOptions = GetViewEngineOptions();
var setup = new RazorPagesRazorViewEngineOptionsSetup(
new TestOptionsManager<RazorPagesOptions>(razorPagesOptions));

// Act
setup.Configure(viewEngineOptions);

// Assert
Assert.Equal(expected, viewEngineOptions.PageViewLocationFormats);
}

[Fact]
public void Configure_AddsPageViewLocationFormats_WithDefaultPagesRoot()
{
// Arrange
var expected = new[]
{
"/Pages/{1}/{0}.cshtml",
"/Pages/Shared/{0}.cshtml",
"/Views/Shared/{0}.cshtml",
};

var razorPagesOptions = new RazorPagesOptions();
var viewEngineOptions = GetViewEngineOptions();
var setup = new RazorPagesRazorViewEngineOptionsSetup(
new TestOptionsManager<RazorPagesOptions>(razorPagesOptions));

// Act
setup.Configure(viewEngineOptions);

// Assert
Assert.Equal(expected, viewEngineOptions.PageViewLocationFormats);
}

[Fact]
public void Configure_AddsSharedPagesDirectoryToViewLocationFormats()
{
// Arrange
var expected = new[]
{
"/Views/{1}/{0}.cshtml",
"/Views/Shared/{0}.cshtml",
"/PagesRoot/Shared/{0}.cshtml",
};

var razorPagesOptions = new RazorPagesOptions
{
RootDirectory = "/PagesRoot",
};
var viewEngineOptions = GetViewEngineOptions();
var setup = new RazorPagesRazorViewEngineOptionsSetup(
new TestOptionsManager<RazorPagesOptions>(razorPagesOptions));

// Act
setup.Configure(viewEngineOptions);

// Assert
Assert.Equal(expected, viewEngineOptions.ViewLocationFormats);
}

[Fact]
public void Configure_AddsSharedPagesDirectoryToAreaViewLocationFormats()
{
// Arrange
var expected = new[]
{
"/Areas/{2}/Views/{1}/{0}.cshtml",
"/Areas/{2}/Views/Shared/{0}.cshtml",
"/Views/Shared/{0}.cshtml",
"/PagesRoot/Shared/{0}.cshtml",
};

var razorPagesOptions = new RazorPagesOptions
{
RootDirectory = "/PagesRoot",
};
var viewEngineOptions = GetViewEngineOptions();
var setup = new RazorPagesRazorViewEngineOptionsSetup(
new TestOptionsManager<RazorPagesOptions>(razorPagesOptions));

// Act
setup.Configure(viewEngineOptions);

// Assert
Assert.Equal(expected, viewEngineOptions.AreaViewLocationFormats);
}

[Fact]
public void Configure_RegistersPageViewLocationExpander()
{
// Arrange
var viewEngineOptions = GetViewEngineOptions();
var setup = new RazorPagesRazorViewEngineOptionsSetup(new TestOptionsManager<RazorPagesOptions>());

// Act
setup.Configure(viewEngineOptions);

// Assert
Assert.Collection(
viewEngineOptions.ViewLocationExpanders,
expander => Assert.IsType<PageViewLocationExpander>(expander));
}

private static RazorViewEngineOptions GetViewEngineOptions()
{
var defaultSetup = new RazorViewEngineOptionsSetup(Mock.Of<IHostingEnvironment>());
var options = new RazorViewEngineOptions();
defaultSetup.Configure(options);

return options;
}
}
}

0 comments on commit 2b8b243

Please sign in to comment.