Injecting IViewLocalizer into Razor Page causing IndexOutOfRangeException

Fixes #6694
This commit is contained in:
Pranav K 2017-08-31 11:24:58 -07:00
parent 7e4a8fe479
commit bac68ba3c2
9 changed files with 122 additions and 1 deletions

View File

@ -122,6 +122,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
_tempDataFactory.GetTempData(_pageContext.HttpContext),
TextWriter.Null,
_htmlHelperOptions);
_viewContext.ExecutingFilePath = _pageContext.ActionDescriptor.RelativePath;
_page = (Page)CacheEntry.PageFactory(_pageContext, _viewContext);
@ -265,6 +266,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
_tempDataFactory.GetTempData(_pageContext.HttpContext),
TextWriter.Null,
_htmlHelperOptions);
_viewContext.ExecutingFilePath = _pageContext.ActionDescriptor.RelativePath;
}
if (_page == null)

View File

@ -1115,6 +1115,30 @@ Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary`1[AspNetCore._InjectedP
Assert.Equal(expected, (await response.Content.ReadAsStringAsync()).Trim());
}
[Fact]
public async Task ViewLocalizer_WorksForPagesWithoutModel()
{
// Arrange
var expected = "Bon Jour from Page";
// Act
var response = await Client.GetStringAsync("/Pages/Localized/Page?culture=fr-FR");
Assert.Equal(expected, response.Trim());
}
[Fact]
public async Task ViewLocalizer_WorksForPagesWithModel()
{
// Arrange
var expected = "Bon Jour from PageWithModel";
// Act
var response = await Client.GetStringAsync("/Pages/Localized/PageWithModel?culture=fr-FR");
Assert.Equal(expected, response.Trim());
}
private async Task AddAntiforgeryHeaders(HttpRequestMessage request)
{
var getResponse = await Client.GetAsync(request.RequestUri);

View File

@ -356,6 +356,32 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
Assert.Same(pageModel.PageContext.ViewData, pageResult.ViewData);
}
[Fact]
public async Task InvokeAction_WithPage_SetsExecutingFilePath()
{
// Arrange
var relativePath = "/Pages/Users/Show.cshtml";
var descriptor = CreateDescriptorForSimplePage();
descriptor.RelativePath = relativePath;
object instance = null;
var pageFilter = new Mock<IPageFilter>();
AllowSelector(pageFilter);
pageFilter
.Setup(f => f.OnPageHandlerExecuting(It.IsAny<PageHandlerExecutingContext>()))
.Callback<PageHandlerExecutingContext>(c =>
{
instance = c.HandlerInstance;
});
var invoker = CreateInvoker(new[] { pageFilter.Object }, descriptor);
// Act
await invoker.InvokeAsync();
// Assert
var page = Assert.IsType<TestPage>(instance);
Assert.Equal(relativePath, page.ViewContext.ExecutingFilePath);
}
#endregion
#region Handler Selection

View File

@ -0,0 +1,3 @@
@page
@inject Microsoft.AspNetCore.Mvc.Localization.IViewLocalizer Localizer
@Localizer["Hello"]

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Hello" xml:space="preserve">
<value>Bon Jour from Page</value>
</data>
</root>

View File

@ -0,0 +1,13 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace RazorPagesWebSite.Pages.Localized
{
public class PageWithModel : PageModel
{
public IActionResult OnGet() => Page();
}
}

View File

@ -0,0 +1,4 @@
@page
@model PageWithModel
@inject Microsoft.AspNetCore.Mvc.Localization.IViewLocalizer Localizer
@Localizer["Hello"]

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Hello" xml:space="preserve">
<value>Bon Jour from PageWithModel</value>
</data>
</root>

View File

@ -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.Globalization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.Extensions.DependencyInjection;
@ -13,7 +14,7 @@ namespace RazorPagesWebSite
{
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options => options.LoginPath = "/Login");
services.AddMvc()
.AddCookieTempDataProvider()
.AddViewLocalization()
.AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizePage("/HelloWorldWithAuth");
@ -31,6 +32,18 @@ namespace RazorPagesWebSite
app.UseStaticFiles();
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("fr-FR"),
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
app.UseMvc();
}
}