Injecting IViewLocalizer into Razor Page causing IndexOutOfRangeException
Fixes #6694
This commit is contained in:
parent
7e4a8fe479
commit
bac68ba3c2
|
|
@ -122,6 +122,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
_tempDataFactory.GetTempData(_pageContext.HttpContext),
|
_tempDataFactory.GetTempData(_pageContext.HttpContext),
|
||||||
TextWriter.Null,
|
TextWriter.Null,
|
||||||
_htmlHelperOptions);
|
_htmlHelperOptions);
|
||||||
|
_viewContext.ExecutingFilePath = _pageContext.ActionDescriptor.RelativePath;
|
||||||
|
|
||||||
_page = (Page)CacheEntry.PageFactory(_pageContext, _viewContext);
|
_page = (Page)CacheEntry.PageFactory(_pageContext, _viewContext);
|
||||||
|
|
||||||
|
|
@ -265,6 +266,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
_tempDataFactory.GetTempData(_pageContext.HttpContext),
|
_tempDataFactory.GetTempData(_pageContext.HttpContext),
|
||||||
TextWriter.Null,
|
TextWriter.Null,
|
||||||
_htmlHelperOptions);
|
_htmlHelperOptions);
|
||||||
|
_viewContext.ExecutingFilePath = _pageContext.ActionDescriptor.RelativePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_page == null)
|
if (_page == null)
|
||||||
|
|
|
||||||
|
|
@ -1115,6 +1115,30 @@ Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary`1[AspNetCore._InjectedP
|
||||||
Assert.Equal(expected, (await response.Content.ReadAsStringAsync()).Trim());
|
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)
|
private async Task AddAntiforgeryHeaders(HttpRequestMessage request)
|
||||||
{
|
{
|
||||||
var getResponse = await Client.GetAsync(request.RequestUri);
|
var getResponse = await Client.GetAsync(request.RequestUri);
|
||||||
|
|
|
||||||
|
|
@ -356,6 +356,32 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
|
||||||
Assert.Same(pageModel.PageContext.ViewData, pageResult.ViewData);
|
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
|
#endregion
|
||||||
|
|
||||||
#region Handler Selection
|
#region Handler Selection
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
@page
|
||||||
|
@inject Microsoft.AspNetCore.Mvc.Localization.IViewLocalizer Localizer
|
||||||
|
@Localizer["Hello"]
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
@page
|
||||||
|
@model PageWithModel
|
||||||
|
@inject Microsoft.AspNetCore.Mvc.Localization.IViewLocalizer Localizer
|
||||||
|
@Localizer["Hello"]
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// 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.Builder;
|
||||||
using Microsoft.AspNetCore.Authentication.Cookies;
|
using Microsoft.AspNetCore.Authentication.Cookies;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
@ -13,7 +14,7 @@ namespace RazorPagesWebSite
|
||||||
{
|
{
|
||||||
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options => options.LoginPath = "/Login");
|
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options => options.LoginPath = "/Login");
|
||||||
services.AddMvc()
|
services.AddMvc()
|
||||||
.AddCookieTempDataProvider()
|
.AddViewLocalization()
|
||||||
.AddRazorPagesOptions(options =>
|
.AddRazorPagesOptions(options =>
|
||||||
{
|
{
|
||||||
options.Conventions.AuthorizePage("/HelloWorldWithAuth");
|
options.Conventions.AuthorizePage("/HelloWorldWithAuth");
|
||||||
|
|
@ -31,6 +32,18 @@ namespace RazorPagesWebSite
|
||||||
|
|
||||||
app.UseStaticFiles();
|
app.UseStaticFiles();
|
||||||
|
|
||||||
|
var supportedCultures = new[]
|
||||||
|
{
|
||||||
|
new CultureInfo("en-US"),
|
||||||
|
new CultureInfo("fr-FR"),
|
||||||
|
};
|
||||||
|
|
||||||
|
app.UseRequestLocalization(new RequestLocalizationOptions
|
||||||
|
{
|
||||||
|
SupportedCultures = supportedCultures,
|
||||||
|
SupportedUICultures = supportedCultures
|
||||||
|
});
|
||||||
|
|
||||||
app.UseMvc();
|
app.UseMvc();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue