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),
|
||||
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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
// 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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue