【问题标题】:Blazor Server get current page only without parametersBlazor Server 仅获取当前页面,不带参数
【发布时间】:2021-11-10 03:01:28
【问题描述】:

我有一个 blazor 服务器应用程序,我想获取当前页面名称,以便出于其他原因保留该页面的数据。

我可以看到 NavigationManager 提供了完整的 uri(如 http://site:1234/page)以及基本 uri(如 http://site:1234),我可以通过删除基本内容来确定页面uri 从完整的 uri 中获取 /page 组件。

但是,如果页面有参数传递给它,那么 uri 将变为 http://site:1234/page/param1/param2 并且很难从完整的 uri 中可靠地确定页面名称。

如果你有一个嵌套的页面结构,那就更复杂了,所以 http://site:1234/category/page/param1/param2。

一种方法是为@page 指令使用一个变量,但是它不会暴露在组件之外,而不会使它在层次结构中向上\向下冒泡,所以如果我想从 Navigation\appLayout 组件中获取当前页面,我会需要对需要的每个页面的参数进行级联(提出?)。

另一种方法是切换到更正式的查询字符串方法(例如 /page?param1=value&param2=value 等),但这也意味着每个页面都需要更改为然后读取和解释该字符串,而不是依赖于默认的 blazor 参数解释。

我会接受完整路径(所以 /category/page)

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: blazor


    【解决方案1】:

    Router 组件公开了具有 PageType 属性的 RouteData。

    因此,如果您级联 RouteData,您可以在任何需要的地方获取它。

    在您的 App 组件中

    <Router AppAssembly="@typeof(Program).Assembly">
        <Found Context="routeData">
            <CascadingValue Value="routeData" IsFixed=true>
                <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
            </CascadingValue>
        </Found>
        <NotFound>
            <LayoutView Layout="@typeof(MainLayout)">
                <p>Sorry, there's nothing at this address.</p>
            </LayoutView>
        </NotFound>
    </Router>
    

    在任何其他布局/组件中,您都可以接收该数据

    [CascadingParameter] public RouteData routeData { get; set; }
    

    【讨论】:

      【解决方案2】:

      我不确定我的答案。如果我错了,请原谅我。 在 blazor 中有一个名为 NavigationManager 的对象。 我目前没有电脑,但你可以试试 NavigationManager.BaseUri

      【讨论】:

      • 试试这个:CurrUrl = NavigationManager.Uri.ToString().ToLower(); CurrUrl = CurrUrl.Replace(NavigationManager.BaseUri, "");
      • 如果您阅读了我最初的问题,这几乎可以工作......但是 NavigationManager.Uri 还包含任何参数信息,这些信息会在每次执行页面时发生变化,因此不是我需要的。
      猜你喜欢
      • 2017-07-19
      • 2011-05-07
      • 2012-01-08
      • 1970-01-01
      • 2012-12-04
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多