我想将一个复杂的对象从另一个blazor页面转发到另一个页面。让我们考虑以下三个类。
public class Order
{
public Supplier { get; }
public List<Product> Products { get; } = new List<Product>();
public decimal TotalValue { get; set; }
public Order(Supplier supplier)
{
Supplier = supplier;
}
}
public class Supplier
{
public int SupplierId { get; set; }
public int DeliveryConditions { get; set; }
public int PaymentConditions { get; set; }
}
public class Product
{
public int ProductId { get; set; }
public int Quantity { get; set; }
}
现在我有两页了。第一个允许用户选择供应商,并根据供应商创建Order类型的对象。第二个页面应该使用这个对象,并且应该允许用户编辑除供应商之外的所有其他订单详细信息。
在我的情况下,我需要首先选择供应商,以便能够筛选出供应商无法交付的所有产品。
我怎么能做到这一点?
谢谢!
您考虑过使用单例服务吗?这可以通过@inject和singleton在所有页面上使用。您可以在选择供应商并生成订单的页面中设置供应商并进行订单。并将其注入其他页面。
public class OrderService{
public Order ActiveOrder {get;private set;}
public Supplier ActiveSupplier {get;set;}
public void GenerateOrder(Supplier s) {
//...
}
}
您必须在Startup中将服务注册为singleton:
builder.Services.AddSingleton<OrderService>();
所以你可以在你的页面中使用它,比如:
@inject OrderService MyOrderService
private void SupplierSelected(Supplier s)
{
MyOrderService.GenerateOrder(s);
}
您必须使用parameter关键字,当第一个组件有数据时,它将加载到第二个组件:在你放的例子中,第一页将是供应商,当它完成时,你把它作为一个参数传递:
@using Pages
@page "/"
<h1>First supplier page</h1>
<label> Supplier Id</label>
<input @bind="@sup.SupplierId" type="int"/>
<button @onclick="() => this.done=true"> Submit </button>
@if(done) {
<product supplier="sup"></product>
}
@code{
public bool done=false;
Supplier sup = new();
}
在这里,您可以看到如何将供应商作为参数传递给第二个blazor组件。在此页面中,您可以根据需要使用对象。
@using Pages
<h3>Second page with supplier as parameter</h3>
//whatever presentation
@code {
[Parameter]
public Supplier supplier{ get; set; }
//whatever logic
}