使用Entity Framework时含导航属性的表单无法提交问题排查
C# Razor Pages导航属性表单提交异常排查
我正在学习C#,首个项目里碰到不少导航属性相关问题,核心障碍是包含导航属性的基础模型(以及所有带导航属性的模型)表单提交异常。
最初用脚手架生成Company的CRUD Razor Pages,没包含任何导航属性,不确定是操作错误还是默认行为。手动修改页面添加CompanyType后,下拉选择列表能正常显示,但点击提交时提示必须填写CompanyType;如果将其设为非必填,提交后CompanyType字段为空。
我知道可以直接用ID代替导航属性,但后续存在多对多导航属性的场景,ID方案不适用,且这类场景也有相同问题,现需排查当前错误原因。
模型与上下文代码
Company模型
public class Company { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Key] [Display(Name = "Id")] public int Id { get; set; } [Display(Name = "Name")] public string Name { get; set; } public CompanyType Type { get; set; } public ICollection<Contact>? Contacts { get; set; } }
CompanyType模型
public class CompanyType { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Key] [Display(Name = "Id")] public int Id { get; set; } [Display(Name = "Company Type")] public string Type { get; set; } = ""; }
SRMContext上下文
已移除上下文中无关模型
public class SRMContext : DbContext { public DbSet<Company> Companies { get; set; } public DbSet<Contact> Contacts { get; set; } public DbSet<CompanyType> CompanyTypes { get; set; } public SRMContext (DbContextOptions<SRMContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Company>().ToTable("Companies"); modelBuilder.Entity<Contact>().ToTable("Contacts"); modelBuilder.Entity<CompanyType>().ToTable("CompanyTypes"); } }
页面代码
CreateModel代码
public class CreateModel : PageModel { private readonly SRMContext _context; public SelectList CompanyTypes { get; set; } public CreateModel(SRMContext context) { _context = context; } public async Task<IActionResult> OnGetAsync() { CompanyTypes = new SelectList(_context.CompanyTypes, nameof(CompanyType.Id), nameof(CompanyType.Type)); return Page(); } [BindProperty] public Company Company { get; set; } // 防止过度提交攻击 public async Task<IActionResult> OnPostAsync() { if (!ModelState.IsValid) { return Page(); } _context.Companies.Add(Company); await _context.SaveChangesAsync(); return RedirectToPage("./Index"); } }
视图页面代码
<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="Company.Name" class="control-label"></label> <input asp-for="Company.Name" class="form-control" /> <span asp-validation-for="Company.Name" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Company.Type" class="control-label"></label> <select asp-for="Company.Type" asp-items="Model.CompanyTypes" class="form-control"></select> <span asp-validation-for="Company.Type" class="text-danger"></span> </div> <div class="form-group"> <input type="submit" value="Create" class="btn btn-primary" /> </div> </form> </div> </div>
内容的提问来源于stack exchange,提问作者alexander7567
相关产品推荐
相关产品推荐

