Razor 页面:如何制作带有外键的模型

Razor pages: how to make a model with a foreign key

我正在使用 Razor 页面做一个小项目。是关于汽车的。所以我从两个 classes 创建了两个脚手架项目:MakerModel.

这是Makerclass

public class Maker
{
    public int Id { get; set; }
    public string Name { get; set; }
}

这是 Model class

public class Model
{
    public int Id { get; set; }
    public Maker Maker { get; set; }
    public string Name { get; set; }
}

public class CreateModel : PageModel
{
    private readonly ArchivioItalianeDaCorsa.Data.ApplicationDbContext _context;
    public List<SelectListItem> makers { get; set; }

    public CreateModel(ArchivioItalianeDaCorsa.Data.ApplicationDbContext context)
    {
        _context = context;
    }

    public IActionResult OnGet()
    {
        caseAutomobilistiche = _context.makers.Select(maker => new 
        SelectListItem
        {
            Text = maker.Name,
            Value = maker.Id.ToString()
        }).ToList();
        return Page();
    }

    [BindProperty]
    public Modello Modello { get; set; }

    // To protect from overposting attacks, see https://aka.ms/RazorPagesCRUD
    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        _context.Model.Add(Modello);

        await _context.SaveChangesAsync();

        return RedirectToPage("./Index");
    }
}

最后但并非最不重要的是,html

<h1>Create</h1>

<h4>Modello</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Model.Maker" class="control-label"></label>
                <select class="form-select" aria-label="Marca select" asp-items="Model.makers" asp-for="Model.Maker" name="Marca">
                   <option>Seleziona una marca</option>
                </select>
                <label asp-for="Model.Name" class="control-label"></label>
                <input asp-for="Model.Name" class="form-control" />
                <span asp-validation-for="Model.Name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

当我尝试创建一个新的 Model 时出现了我的问题。在 onGet 中,我查询数据库以在 select 标记中显示所有可能的制造商,但我无法将选择绑定到需要保存的对象。

classModel错了吗?

PS:该代码最初是用意大利语编写的,我在提问时对其进行了翻译,所以如果有不清楚的地方请告诉我,我会解决问题

在您的 select 列表项中,选项字段中的值为 Maker.Id,因此传递给模型的值是一个整数,而不是对象。

写约束的时候最好明确一点,像这样重写你的Modelclass;

public class Model
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string Name { get; set; }

    public int MakerId { get; set; }
    [ForeignKey("MakerId")]
    public Maker Maker { get; set; }

}

在上面的代码中,我们明确指示 entity framework 模型具有不可为空的外键 MakerId。此 属性 将成为数据库中的一列,您可以在其中保存 select 列表中的值。

尝试在重写模型后搭建一个新的 razor 页面。

asp-items="Model.makers" asp-for="Model.Maker" name="Marca"

1.According 到 asp-items="Model.makers" 在你的 html 中,你使用制造商绑定数据。在您的 OnGet 中,将 caseAutomobilistiche 更改为 makers

2.Delete name属性,因为asp-for会生成name绑定数据。

3.changeasp-for="Model.Maker"变成asp-for="Model.Maker.Id"

您可以获得 MakerId,然后做您的其他事情。

结果: