Blazor:如何存储页面状态(所有组件状态)?

Blazor:如何存储页面状态(所有组件状态)?,blazor,blazor-server-side,Blazor,Blazor Server Side,我有一个完整的页面表组件(自定义,带有列过滤器、排序、动态加载、“无限”滚动等等),然后用户单击行上的“编辑”操作,它将导航到编辑项页面。还是整页。这是一个要求,它应该是视觉上独立的页面。2个原因:用户的一大任务是搜索,表越大,数据越多越好。第二项任务是更新一些记录。单个记录是一个非常非常复杂的数据集,它需要尽可能多的屏幕空间 问题是,当用户编辑完记录后,应用程序会导航到上一页,但表会重置,并使用默认的过滤、排序和滚动位置 我可以从表组件中提取数据,并将其存储在“伪会话”服务数据中。问题是,我必

我有一个完整的页面表组件(自定义,带有列过滤器、排序、动态加载、“无限”滚动等等),然后用户单击行上的“编辑”操作,它将导航到编辑项页面。还是整页。这是一个要求,它应该是视觉上独立的页面。2个原因:用户的一大任务是搜索,表越大,数据越多越好。第二项任务是更新一些记录。单个记录是一个非常非常复杂的数据集,它需要尽可能多的屏幕空间

问题是,当用户编辑完记录后,应用程序会导航到上一页,但表会重置,并使用默认的过滤、排序和滚动位置

我可以从表组件中提取数据,并将其存储在“伪会话”服务数据中。问题是,我必须向表组件加载/保存状态方法添加大量代码。非常多的工作(针对每个列过滤器元素,然后针对列过滤器行)

但有一个更简单的方法。我不需要使用单独的页面,我可以假装它。将表格和行编辑表单放在同一页上,然后用JS/CSS隐藏其中一部分。这应该行得通,但IDK,对我来说,这似乎是一个丑陋的黑客。渲染两个部分后,显示一个

顺便说一句,如果您将服务器端的组件隐藏在
.razor
文件中,然后再次显示,则会重置该组件。将调用构造函数,所有参数设置为默认值,初始值

有没有一种方法可以在服务器端隐藏渲染片段,然后显示它,而不会导致Blazor重新初始化它

还是一个“返回”函数,显示最后一页的状态与导航发生前完全相同

更新: 我刚刚测试了隐藏选项。作为一种魅力。以下是方法:

<div style="@("display: " + (CurrentView == ViewOptions.List ? "block" : "none"))">
    @* My list view here... *@
</div>
@if (CurrentView == ViewOptions.Edit) {
    @* My edit entry view here... *@
}

@*我的列表视图在这里*@
@如果(CurrentView==ViewOptions.Edit){
@*我的编辑条目视图在这里*@
}
其中
ViewOptions
只是一个包含可能视图的
enum
CurrentView
的类型为
ViewOptions
。当
CurrentView
设置为
List
时,第一部分可见,第二部分根本不渲染。当它改变时,第一部分被隐藏(但不被破坏),第二部分被初始化并呈现。由于我的表单已经作为单独的组件完成,它们以行标识符作为参数,并触发自己的事件,允许在用户完成操作时将
CurrentView
切换回列表。所以我们基本上在一个页面上有两个虚拟页面。这是一个老套的解决方案,但很有效。我在30分钟内完成了这项工作,而不是在我的
DataTable
组件中添加加载/保存功能

不过,也许还有更好的办法?或者它是最优的?喜欢我们有网页(彼此直接无关)和。。。子页面,类似于视觉上独立的,但在逻辑上直接与其父页面相关


这给了我一个想法。。。如果我制作了一个名为
子页面
?:)的组件会怎么样Blazor中已经有一个名为
Page
的组件。因此,它希望完成页面和子页面的整个概念。当页面没有直接关联时,导航“返回”到上一页没有多大意义。甚至可以维护不相关页面的状态。但是这个子页面是直接相关的。其内容取决于父页面状态。IDK,也许那样做太疯狂了;)

TL;医生:我认为你走的是正确的低努力的道路

“正确的”(或者更确切地说,完整的)方法是实现所有状态存储(实现、公开、处理事件,将数据存储在浏览器本地存储或应用程序状态等位置)。正如您所发现的,如果用real
切换组件会重置它-这就是应用程序状态的来源-您会将状态保留在与更改它相关的事件中,然后下次组件初始化时,它会读取该状态。但是你必须自己实现它,这是大量的工作

因此,有两种更简单的解决方案:

  • 如您所见,使用CSS隐藏旧内容(如果需要),并在同一页面上显示新内容。如果在某种窗口/对话框中显示,则可能根本不需要隐藏旧内容

  • 或者,使用某人编写的组件,该组件已经内置了这些状态功能,因此您可以直接使用它们。”据我所知,这是一个商业广告


啊,我的竞争对手;)我想知道如何使用Telerik组件,但我们需要这么多不同的功能,除此之外,我还想了解细节,所以我制作了非常类似的组件,但它使用的不是“页面”,而是一种“无限滚动器”——因此在用户滚动表格时,内容是预加载的。还有许多其他功能,但不是状态管理;)披露:我为Telerik工作。这就是说,网格具有无限(虚拟)滚动和大量其他功能:)也就是说,我确实认为您所做的可以工作,至少目前是这样。如果你开始在其他页面上或在用户会话之间需要这种状态,你必须全力以赴实现一个实际的组件和/或应用程序状态。它通过了我的测试,但客户端声称应用程序开始减速,在使用几个小时后崩溃。内存泄漏?而这一切仅仅是因为不同记录的呈现形式之间没有页面切换?可能在其他地方有漏洞,不一定在UI部分,一个数据服务缓存的东西,永远不会发布它听起来更有可能。如果您的自定义网格组件太复杂,那么它也可能泄漏,特别是如果Dispose上没有在应该的时候进行某些资源清理(例如清除REF和js互操作处理程序),那么表将保持不变,因此它不是问题的根源。但形式不同于其他形式