如标题所述,我试图从blazor中的路由中获取一些值,这应该可用于所有页面。认为"culture-select"或";multi-tenancy"或类似的。
。用/base/{culture}/my/fancy/page
或/base/{my-tenant}/their/fancy/page
我希望{culture}
或{my-tenant}
的内容可以作为<CascadingValue>
或可绑定参数。
我可能会使用一个基类或任何东西来解决这个问题,但我希望有一种方法,这将不需要实现自己的路由器或路由解析器来完成这一点。
你可以覆盖MainLayout组件的OnParametersSet方法,捕获RouteValues
对象中可用的参数值,并将它们传递给CascadingValue组件的Value属性,以便级联到子组件…
@code
{
private string Culture{ get; set; }
protected override void OnParametersSet()
{
// pull out the "culture" parameter from the route data
object culture = null;
if ((this.Body.Target as
RouteView)?.RouteData.RouteValues?.TryGetValue("Culture", out
culture) == true)
{
Culture = culture?.ToString();
}
}
// Note: The first argument to `TryGetValue` is the parameter name
// defined in the in page with the route template
// `/base/{culture}/my/fancy/page`
// It is not the local `Culture` property we use in MainLayout to pass to
// the CascadingValue component's Value attribute property, right ;}
}
MainLayout的视图部分可能看起来像这样:
<div class="main">
<div class="top-row px-4">
@Header
</div>
<div class="content px-4">
@Body
</div>
</div>
</div>
您可以使用this
而不是Culture
来传递对MainLayout的引用,在子组件中将CascadingParameter定义为MainLayout类型,并像这样访问Culture属性:
var culture = MainLayout.Culture;
注意:在你的例子中,你可以定义一个类来级联{culture} and {my-tenant}