如何在 .net core razor 页面中绑定复选框?

How do you bind a checkbox in .net core razor pages?

如何在 .net core razor 页面中绑定复选框? 我目前遇到提交表单时复选框值没有返回的问题(使用 post 方法)。

下面是我的代码。

域名类:

public class Restaurant
{
    public int Id { get; set; }
    [Required, StringLength(80)]
    public string Name { get; set; }
    public Meals MealsServed { get; set; }

}
public class Meals
{
    public int Id { get; set; }
    public bool Breakfast { get; set; }
    public bool Lunch { get; set; }
    public bool Dinner { get; set; }
}

来自页面模型:

    [BindProperty]
    public Restaurant Restaurant{ get; set; }
    public EditModel(IRestaurantData restaurantData, IHtmlHelper htmlHelper)
    {
        this.restaurantData = restaurantData;
        this.htmlHelper = htmlHelper;
    }
    public IActionResult OnGet(int? restaurantId)
    {

            Restaurant = restaurantData.GetById(restaurantId.Value);
            Restaurant.MealsServed.Breakfast = true;
            return Page();
    }

    public IActionResult OnPost()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }
        restaurantData.Update(Restaurant);
        restaurantData.Commit();
        TempData["Message"] = "Restaurant Saved";
        return RedirectToPage("./Detail", new { restaurantId = Restaurant.Id });

    }

来自剃须刀页面:

<form method="post">
<input type="hidden" asp-for="Restaurant.Id" />
<div class="form-group">
    <label asp-for="Restaurant.Name"></label>
    <input asp-for="Restaurant.Name" class="form-control" />
    <span class="text-danger" asp-validation-for="Restaurant.Name"></span>
</div>

<div class="form-group">
    <input asp-for="Restaurant.MealsServed.Lunch" />
    <label asp-for="Restaurant.MealsServed.Lunch"> </label>
</div>

<button type="submit" class="btn btn-primary">Save</button>
</form>

所以,我想出了问题。我上面介绍的一切都是正确的。 选中 Lunch 的复选框并保存项目,然后再次查看 Restaurant 项目后,它会返回未选中状态。

问题在于我从数据库中提取的数据的深度。它只是拉取顶级数据。 所以,我不得不改变 GetById 方法:

public Restaurant GetById(int id)
{
   return db.Restaurants.Find(id);
}

至:

public Restaurant GetById(int id)
{
  return db.Restaurants.Where(r => r.Id == id).Include(r => r.MealsServed).FirstOrDefault();            
}

明确告诉它为 MealsServed 中的对象提取数据 属性。