在使用 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);
我希望解决方案是将文化包含在到客户端的重定向中,但我不知道如何在管道中配置它。我宁愿不在处理程序中执行此操作。
从客户端请求中检索区域性并将其包含在 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();
}