gpt4 book ai didi

c# - 使用 IPageRouteModelConvention 时获取版本

转载 作者:行者123 更新时间:2023-11-30 12:19:44 29 4
gpt4 key购买 nike

我前段时间问过how to add some kind of localized url's , IPageRouteModelConvention 以一种对我来说完美的方式发挥作用。

这样我就可以使用不同语言/名称的路线。


如果我使用 www.domain.com/nyheter(瑞典语)或 www.domain.com/sistenytt(挪威语),我仍然只能在 中找到RouteData,使用了 News 路由 (RouteData.Values["page"])。

我如何获得哪个版本?

我知道我可以检查/解析 context.Request.Path 但我想知道是否有一个内置属性会给我它。


启动

services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2).AddRazorPagesOptions(options =>
{
options.Conventions.Add(new LocalizedPageRouteModelConvention(new LocalizationService(appsettings.Routes)));
});

appsettings.Routesappsettings.json

读取
"Routes": [
{
"Page": "/Pages/News.cshtml",
"Versions": [ "nyheter", "sistenytt" ]
},
and so on....
]

public class LocalizedPageRouteModelConvention : IPageRouteModelConvention
{
private ILocalizationService _localizationService;

public LocalizedPageRouteModelConvention(ILocalizationService localizationService)
{
_localizationService = localizationService;
}

public void Apply(PageRouteModel model)
{
var route = _localizationService.LocalRoutes().FirstOrDefault(p => p.Page == model.RelativePath);
if (route != null)
{
foreach (var option in route.Versions)
{
model.Selectors.Add(new SelectorModel()
{
AttributeRouteModel = new AttributeRouteModel
{
Template = option
}
});
}
}
}
}

最佳答案

要检索 RouteData 值,您可以在路由模板中指定标记。例如,路由 {version} 将添加 RouteDataversion ,该值将从 URL 的第一段获取。在您的示例中,您没有为 version 指定 token ,因此正如您所描述的那样,它不会有 RouteData 值。

针对您的特定问题的解决方案分为两部分:

  1. 在创建新的 SelectorModel 时不使用特定值,而是使用如上所述的标记。
  2. 有了这个,您现在可以从 RouteData 访问 version 值,但新的问题是任何值可以提供,无论是否在您的配置中指定。

要解决第二个问题,可以转向IActionConstraint。这是一个实现:

public class VersionConstraint : IActionConstraint
{
private readonly IEnumerable<string> allowedValues;

public VersionConstraint(IEnumerable<string> allowedValues)
{
this.allowedValues = allowedValues;
}

public int Order => 0;

public bool Accept(ActionConstraintContext ctx)
{
if (!ctx.RouteContext.RouteData.Values.TryGetValue("version", out var routeVersion))
return false;

return allowedValues.Contains((string)routeVersion);
}
}

VersionConstraint 获取允许值列表(例如 nyhetersistenytt)并检查 version RouteData 值匹配。如果不匹配,则“操作”(此时它实际上是一个页面)将不匹配并以 404 结束。

有了该实现,您可以将 LocalizedPageRouteModelConventionApply 实现更新为如下所示:

var route = _localizationService.LocalRoutes().FirstOrDefault(p => p.Page == model.RelativePath);
if (route != null)
{
model.Selectors.Add(new SelectorModel
{
AttributeRouteModel = new AttributeRouteModel
{
Template = "{version}"
},
ActionConstraints =
{
new VersionConstraint(route.Versions)
}
});
}

此实现添加了一个新的 SelectorModel,该 SelectorModel 设置了 Version RouteData 值,并被限制为仅允许配置中指定的值.

关于c# - 使用 IPageRouteModelConvention 时获取版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56090637/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com