我有一个主页面,在这个页面上有一个对象列表。使用foreach获取它的项,当你点击按钮时,我想传递该项到另一个页面。我如何传递?
int
, string
),你可以将该值作为路径参数或查询参数传递到其他页面:<ul>
<li><a href="/page/a">A</a></li>
<li><a href="/page/b">B</a></li>
<li><a href="/page/c">C</a></li>
</ul>
转至页面:
@page "/page/{PathParam}"
<h1>Page @this.PathParam</h1>
@code {
[Parameter]
public string PathParam { get; set; }
}
然而,如果数据更为复杂,请尝试使用此处描述的选项之一:https://learn.microsoft.com/en-us/aspnet/core/blazor/state-management?view=aspnetcore-5.0&pivots=webassembly(服务器端存储、浏览器存储或内存状态容器服务)
StateContainer
(内存解决方案)。MauiProgram.cs
中注册您的StateContainer
,如下所示:builder.Services.AddSingleton<StateContainer>();
其中 StateContainer.cs
包含:
public readonly Dictionary<int, object> ObjectTunnel = new();
然后,只是举个例子,我将创建一个名为ComplexObject.cs
的文件。
public class ComplexObject
{
public int Count = 0;
public string Color = string.Empty;
}
Index.razor
和Counter.razor
,并且你想要从一个页面发送ComplexObject
到另一个页面时,在Index.razor
中注入StateContainer
,然后调用类似以下的方法:public void OpenCounterWithData()
{
var data = new ComplexObject{Count = 3, Color="red"}
_stateContainer.ObjectTunnel.Add(data.GetHashCode(), data)
_navigationManager.Navigate($"counter/{data.GetHashCode()}")
}
Counter.razor
中,您可以指定页面如下:@page "/counter/{SetHashCode:int}"
和输入参数:
[Parameter] public int SetHashCode { get; set; }
OnInitialized
中,你可以从StateContainer
中提取值,例如:protected override void OnInitialized()
{
var data = (ComplexObject) _stateContainer.ObjectTunnel[SetHashCode];
}
ObjectTunnel
中移除该对象。这基本上是整个流程。
优化:
StateContainerExtensions.cs
public static class StateContainerExtensions
{
public static int AddRoutingObjectParameter(this StateContainer stateContainer, object value)
{
stateContainer.ObjectTunnel[value.GetHashCode()] = value;
return value.GetHashCode();
}
public static T GetRoutingObjectParameter<T>(this StateContainer stateContainer, int hashCode)
{
return (T) stateContainer.ObjectTunnel.PopValue(hashCode);
}
}
和 DictionaryExtensions.cs
public static class DictionaryExtensions
{
public static TValue PopValue<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TKey keyName) where TKey : notnull
{
var value = dictionary[keyName];
dictionary.Remove(keyName);
return value;
}
}
_stateContainer.ObjectTunnel.Add(data.GetHashCode(), data)
只使用:
_stateContainer.AddRoutingObjectParameter(_trainingSet);
var data = (ComplexObject) _stateContainer.ObjectTunnel[SetHashCode];
_stateContainer.ObjectTunnel.Remove(SetHashCode);
var data = _stateContainer.GetRoutingObjectParameter<ComplexObject>(SetHashCode);
IDictionary
,您将其传递给新页面 - newpage/1。然后,NewPage使用1从服务中检索特定对象。请参阅MSDocs有关服务的信息 - https://learn.microsoft.com/en-us/aspnet/core/blazor/fundamentals/dependency-injection?view=aspnetcore-5.0&pivots=webassembly - MrC aka Shaun Curtis