【问题标题】:Pass data from one Razor page to another without using route parameters在不使用路由参数的情况下将数据从一个 Razor 页面传递到另一个页面
【发布时间】:2020-07-13 04:04:08
【问题描述】:

我有一个页面add,它将向OnValidSubmit 上的数据库添加一个项目,然后重定向到页面list。在页面list 上,我想显示一条成功消息,例如“item added”。

我只想显示一次成功消息“item added”。如果用户刷新页面,它就会消失。所以通过URL 传递的路由参数似乎是错误的,因为它会在刷新后继续存在。

那么,我怎样才能一次性传递“显示成功消息”标志以及一些额外的数据,例如项目名称?

提示:我正在使用 Blazor 服务器端

【问题讨论】:

  • 到目前为止你尝试过什么?有很多方法可以做到这一点...您是否尝试过使用 Session?
  • 我是 Blazor 新手,只知道路由参数。使用会话,我如何区分直接用户调用list 和重定向到list 和add?由于 Blazor 服务器端的所有内容都在服务器上运行,真的没有像 navigate(page, dataToBePassedWithoutModifyingTheUrl) 这样的东西吗?
  • 从添加重定向之前,设置会话值。在列表中,如果没有找到该值,则不显示它。在页面末尾,删除或更改会话值。
  • 虽然不太可能,但这仍然不会使对list 的并行调用获取会话值而不是从add 调用的list。仍然想知道直接传递数据是否没有更好的方法——因为一切都是服务器端的,所以应该是可能的。不知道是否内置了类似的东西。
  • 我想我知道如何解决这个问题...

标签: c# blazor blazor-server-side


【解决方案1】:

当您从一个页面导航到另一个页面时,页面中的所有状态都会丢失。

没有丢失的是作用域依赖容器。因此,如果您创建一个向 services.AddScoped<MyStateObject>() 注册的对象,那么您将能够在整个应用程序中访问该对象实例——不仅可以跨页面,还可以通过注入多个组件来访问它

@inject MyStateObject State

@if (!string.IsNullOrEmpty(State.Message))
{
  <div class="alert alert-success">@State.Message</div>
}

@code
{
  protected override OnAfterRender(bool firstRender)
  {
    State.Message = null;
  }
}

【讨论】:

  • 我认为这与使用会话有同样的问题 - 你如何保证成功消息显示在 add 重定向到的 list 页面上而不是 list 页面上可能是用户在第二个浏览器选项卡上打开的?
  • 不,没有任何问题。这是正确的答案,他建议您定义一个服务类来完成这项工作。这是在组件内共享状态的最佳方式。请接受答案。
  • 除了 peter 和 enet 所建议的之外,您还可以考虑通过数据库等方式来持久化状态。
  • 状态不跨标签共享
  • 啊,太好了,不知道范围服务以及它们的工作方式。太好了,谢谢大家!
猜你喜欢
  • 2016-01-24
  • 2022-01-01
  • 2019-01-14
  • 2020-11-20
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多