【问题标题】:How to have multiple models added in Razor page of Blazor app?如何在 Blazor 应用程序的 Razor 页面中添加多个模型?
【发布时间】:2021-09-13 06:08:14
【问题描述】:

我的 Blazor 应用中有一个 Razor 页面。据我所知,我们只能将一个模型添加到 Razor 页面 Editform。 我的我的属性分布在两个-三个模型中。如何链接到所有属性?我可以参考任何示例或任何链接?提前致谢。

Razor 页面代码 sn-p & @? 我不确定要使用哪种型号:

<div class="card-body">
            <EditForm Model="@?" OnValidSubmit="HandleValidSubmit">
                <DataAnnotationsValidator />
                <hr />
                <div class="form-row">
                    <div class="form-group col">
                        <label>Role</label><br />
                        <InputRadioGroup @bind-Value="Trade.Role" class="form-control">
                            @foreach (var option in rdOptions)
                                {
                                <InputRadio Value="option" /> @option
                                <text>&nbsp;&nbsp;</text>
                                }
                        </InputRadioGroup>
                        <ValidationMessage For="@(() => Trade.Role)" />
                    </div>
                    <div class="form-group col">
                        <label>Company Name</label>
                        <InputSelect id="txtCompanyName" class="form-control" @bind-Value="@TradePartner.CompanyName">
                            <option selected value="-1">-Select-</option>
                            <option value="CompanyName1">CompanyName1</option>
                            <option value="CompanyName2">CompanyName2</option>
                        </InputSelect>
                        <ValidationMessage For="@(() => TradePartner.CompanyName)" />
                    </div>
                </div>
                <div class="form-row">
                    <div class="form-group col">
                        <label>Contact Details of your Trading partner</label>
                        <label>Name</label>
                        <InputText @bind-Value="Trade.PartnerName" class="form-control" />
                        <ValidationMessage For="@(() => Trade.PartnerName)" />
                    </div>
                    <div class="form-group col">
                        <label>Email</label>
                        <InputText @bind-Value="TradePartner.Email" class="form-control" />
                        <ValidationMessage For="@(() => TradePartner.Email)" />
                    </div>
                </div>
 </EditForm>
        </div>

.cs代码,有Trade&TradePartner两种模式:

 public partial class CreateTrade
    {

        public Models.Trade Trade { get; set; }
        public Models.TradePartner TradePartner { get; set; }
        List<string> rdOptions = new List<string> { "Seller", "Buyer" };
       
        protected override void OnInitialized()
        {
            Trade = new Models.Trade();
TradePartner = new Models.TradePartner();
        }
       
        protected async void HandleValidSubmit()
        {
            await Http.PostAsJsonAsync($"api/Trade/", Trade);
            StateHasChanged();
        }

    }

【问题讨论】:

  • 在我看来,如果您在 2 个不同的模型上操作,您应该制作 2 个不同的子组件。这对我来说感觉更干净。

标签: c# razor blazor blazor-server-side blazor-webassembly


【解决方案1】:

您可以创建一个 TradeViewModel.cs (ViewModel) 类并将您需要的所有对象放入剃须刀页面。 然后你只需包含@Model TradeViewModel.cs

class TradeViewModel
{
     public TradePartner TradePartner;
     public Trade Trade;
}

在您的页面文件 (.cshtml) 中

@model=TradeViewModel

【讨论】:

  • 所有模型都是按照数据库创建的。您的意思是创建父模型并添加所需的对象?你可以显示任何sn-p吗?我对此有疑问
  • 目前您正在使用两种模型(TradePartner、Trade)。您可以将这两个作为 shwon public class TradeViewModel { public TradePartner TradePartner; public Trade Trade; } 放在 TradeViewModel.cs 中,然后在文件顶部的剃须刀页面中,您可以包含 @model=TradeViewModel.cs
  • 好的,我认为这与 Meer 的回答相符。
  • 是的,好像差不多,试试看
  • 嗨,你是说创建一个父模型本身。并在其中包含 Trade & TradePartnerDet 作为子模型?
【解决方案2】:

如何创建一个封装两个模型的类,例如:

public class TradeViewModel
{
    public Models.Trade Trade { get; set; }
    public Models.TradePartner TradePartner { get; set; }

    public TradeViewModel()
    {
        Trade = new();
        TradePartner = new();
    }
}

并在您的 EditForm 中使用这个新模型。

【讨论】:

  • 您好,感谢您的回答。我试过这样的东西。如果我在 ediform @model=TradeDto 中使用 TradeDto。如何为剃刀页面中的每个字段使用它?它必须是@bind-value= TradeDto.role?
  • 我已经完成了上述评论方式,但它无法识别子模型中的属性。
  • 如果你已经将TradeDto模型名初始化为TradeDto,那么-TradeDto.Trade.Role
  • 好的,让我试试这个。
  • 很好的解决方案,但这不是 DTO - 它是 ViewModel。
【解决方案3】:

我建议您创建一个 PageModel 来保存所有模型作为要传递给 Razor 页面的属性。

这类似于 mvc 中的视图模型,您可以在其中从多个模型中选择要传递给页面/视图的属性。

这是一个很好的资源: https://www.learnrazorpages.com/razor-pages/pagemodel

【讨论】:

  • 非常感谢您的意见。我不确定页面模型在这种情况下会如何帮助我。
  • PageModel 是 Razor Pages 概念 - 它是一个 ViewModel 和 Controller 合二为一。您不希望 Blazor 中的控制器部分。
猜你喜欢
  • 1970-01-01
  • 2021-05-10
  • 2019-09-15
  • 2019-12-30
  • 2021-03-17
  • 2021-11-23
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
相关资源
最近更新 更多