You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:45:34