Razor 页面:如何制作带有外键的模型
Razor pages: how to make a model with a foreign key
我正在使用 Razor 页面做一个小项目。是关于汽车的。所以我从两个 classes 创建了两个脚手架项目:Maker
和 Model
.
这是Maker
class
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
,因此传递给模型的值是一个整数,而不是对象。
写约束的时候最好明确一点,像这样重写你的Model
class;
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,然后做您的其他事情。
结果:
我正在使用 Razor 页面做一个小项目。是关于汽车的。所以我从两个 classes 创建了两个脚手架项目:Maker
和 Model
.
这是Maker
class
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
,因此传递给模型的值是一个整数,而不是对象。
写约束的时候最好明确一点,像这样重写你的Model
class;
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,然后做您的其他事情。
结果: