当从服务器发送重定向时,用于向 URL 添加文化的 PageRouteModelConvention 会触发客户端上的第二个 get 请求

问题描述 投票:0回答:1

在使用 NET8 的基本 CRUD 应用程序中,我注意到提供消息“人员添加成功”的 TempData 在页面上短暂显示,然后被清除。

检查客户端上的网络流量发现两个 get 请求

https://host/person/edit/1
,然后是
https://host/fr/person/edit/1
。我在数据库中确认正在发送两个请求以供记录。

Person/Create 页面重定向的 OnPost 处理程序设置 TempData["Message"],然后将用户重定向到编辑页面以对 Person 进行后续更改:

return RedirectToPage("./Edit", new { Person.Id });

应用程序使用以下 PageRouteModelConvention 来预先考虑用户选择的区域性(页面下拉列表中的区域性选择器)

public class CultureTemplateRouteModelConvention : IPageRouteModelConvention
{
    public void Apply(PageRouteModel model)
    {
        var selectorCount = model.Selectors.Count;
        for (int i = 0; i < selectorCount; i++)
        {
            var selector = model.Selectors[i];

            model.Selectors.Add(new SelectorModel
            {
                AttributeRouteModel = new AttributeRouteModel
                {
                    Order = -1,
                    Template = AttributeRouteModel.CombineTemplates("{culture?}", selector.AttributeRouteModel.Template),
                }
            });
        }
    }
}

它是通过服务中的约定添加的

services.AddRazorPages(options =>
{
    options.Conventions.Add( new CultureTemplateRouteModelConvention() );
})
    .AddDataAnnotationsLocalization(options =>
    {
        options.DataAnnotationLocalizerProvider = (type, factory) =>
        {
            var assemblyName = new AssemblyName(typeof(SharedResource).GetTypeInfo().Assembly.FullName);
            return factory.Create(nameof(SharedResource), assemblyName.Name);
        };
    })
    .AddViewComponentsAsServices()
    .AddRazorRuntimeCompilation();

然后在 Pipeline 中进行配置

var localizationOptions = app.Services.GetService<IOptions<RequestLocalizationOptions>>().Value;
app.UseRequestLocalization(localizationOptions);

我希望解决方案是将文化包含在到客户端的重定向中,但我不知道如何在管道中配置它。我宁愿不在处理程序中执行此操作。

asp.net-core razor-pages
1个回答
0
投票

从客户端请求中检索区域性并将其包含在 RedirectToPage 中可以防止来自客户端的其他请求。

public async Task<IActionResult> OnPostAsync(CreatePersonCommand person)
{
    var result = await mediator.Send(person);
    HandleResponse(result);
    if (Success)
    {
        var rqf = Request.HttpContext.Features.Get<IRequestCultureFeature>();
        var culture = rqf.RequestCulture.Culture.Name;
        return RedirectToPage("./Edit", new { culture = culture, Id = result.Person.Id });
    }
    return Page();
}
© www.soinside.com 2019 - 2024. All rights reserved.