在Blazor中是否有一些方法可以导航到页面并传递参数而不使用地址栏?

在Blazor中是否有一些方法可以导航到页面并传递参数而不使用地址栏?,blazor,blazor-client-side,Blazor,Blazor Client Side,这存在于许多现代SPA库/框架中 我将提供一个使用React的示例(但它可以是Angular或Vue),您可以执行以下操作 this.props.router.push({ pathname: '/login-successfully', state: { userId: 'john', name: 'John Doe } }) 然后在初始化“其他页面”时,您将有: const {state} = useLocation(); const { userId, nam

这存在于许多现代SPA库/框架中

我将提供一个使用React的示例(但它可以是Angular或Vue),您可以执行以下操作

this.props.router.push({
  pathname: '/login-successfully',
  state: {
    userId: 'john',
    name: 'John Doe
  }
})
然后在初始化“其他页面”时,您将有:

const {state} = useLocation();
const { userId, name } = state; 
您可以渲染如下内容

<p>Welcome Back, {name}!</p>

我可以使用一些等效的方法吗?我知道一个解决办法,创建一个singleton类,将数据存储在那里并成功显示在登录页面上,但我真的希望找到更好的解决方案。

好的,我的第一个答案让我大跌眼镜,因为显然几十年来在URL中传递数据的标准是“垃圾”(实际引用)让我解释一下在这种情况下我到底做了什么。实际上我也不太喜欢在查询字符串中传递数据,尤其是在Blazor中,您很少需要这样做


当我说我不会在共享大量数据的页面之间导航时,我不是在开玩笑。我认为每个页面是一个单独的站点,有自己的加载和保存到数据库的信息。除非我传递的是非常简单的东西,比如URL中的ID,否则我会使用组件来切换子函数

(未经测试的代码,但您可以理解)

主页: main.razor

@if (IsDoingSomethingWithData)
{
     <MyDoingSomethingWithDataComponent ID=variable_ID Name=variable_Name State=variableState />
}
else
{
     <input @bind=variable_state /><br />
     <input @bind=variable_ID /><br />
     <input @bind=variable_name /><br />
     <button @onclick="ToggleDoingSomething">Next</button>
}

@code {
     string variable_state;
     string variable_ID;
     string variable_name;
     bool IsDoingSomethingWithData;
     void ToggleDoingSomething(){
          IsDoingSomethingWithData = !IsDoingSomethingWithData;
     }
}
@if(IsDoingSomethingWithData)
{
}
其他的
{



下一个 } @代码{ 字符串变量_状态; 字符串变量_ID; 字符串变量名称; 布尔是用数据做一些事情; void ToggleDoingSomething(){ IsDoingSomethingWithData=!IsDoingSomethingWithData; } }
组件:MyDoingSomethingWithDataComponent

(即,您本可以导航到的内容,但在Blazor中不需要

Hello,@variable\u name
您的ID是:@variable\u ID
我知道你生活在:@variable_state
@代码{
[参数]
字符串ID;
[参数]
字符串名;
[参数]
字符串状态;
}
如果您实际创建了一个项目并执行了此操作——使用命名参数初始化组件——您将看到它从未被命中,并且在检查页面时,没有任何组件被呈现,直到您将IsDoingSomethingWithData设置为true


魔法

你所说的变通方法是目前唯一可以用于Blazor的方法。为什么你不喜欢使用URL?Blazor模型的优点是地址栏始终反映可导航状态。i、 您可以刷新页面(并将其添加到书签中!)我同意这似乎是一个缺点,但我认为在导航过程中实现传递对象的路线图上甚至没有这一点。每次主题出现在GitHub上,响应都是创建一个作为状态使用的单例。当应用程序只有一个用户时,这是很好的,但是当有多个用户时,这会变得稍微复杂一些——特别是当您被配置为匿名访问时。我想另一种选择是使用会话存储。@KirkWoll简单化的例子本质上是简单化的。当然,有正当的理由希望以框架固有的方式在页面之间传递对象。@KirkWoll仅仅因为页面可以在导航时接收对象,并不能免除开发人员处理对象不存在的情况的需要。有时,构建对象可能是一个昂贵的过程。例如,一个定义了路由的编辑页面接受一个ID,但不接受ID。在后一种情况下,如果要编辑的对象已经在另一个页面上构建,我希望能够传递该对象,而不必访问数据库(如果改为传递ID,则会发生这种情况)我认为每一页都是一个单独的网站-->你真的无法理解SPA哲学。
@if (IsDoingSomethingWithData)
{
     <MyDoingSomethingWithDataComponent ID=variable_ID Name=variable_Name State=variableState />
}
else
{
     <input @bind=variable_state /><br />
     <input @bind=variable_ID /><br />
     <input @bind=variable_name /><br />
     <button @onclick="ToggleDoingSomething">Next</button>
}

@code {
     string variable_state;
     string variable_ID;
     string variable_name;
     bool IsDoingSomethingWithData;
     void ToggleDoingSomething(){
          IsDoingSomethingWithData = !IsDoingSomethingWithData;
     }
}
<div>Hello, @variable_name</div>
<div>Your ID is: @variable_ID</div>
<div>I understand that you live in state: @variable_state</div>

@code{
[Parameter]
string ID;

[Parameter]
string Name;

[Parameter]
string State;
}