如何通过按钮将Aliments表元素添加至Meal Planner表?
完整实现方案:将Aliments添加至膳食规划器
嘿,我来帮你搞定这个「添加至膳食规划器」的功能!你现在写的MealPlannerAliments方法其实是用来查找并返回单个MealPlanner记录的,和咱们要实现的“从Aliments列表选食物添加到MealPlanner”的需求不匹配。下面是完整的实现步骤,咱们一步步来:
1. 先确认模型关联(假设你的实体结构)
首先得确保Aliment和MealPlanner两个模型的关联逻辑合理。比如一个膳食规划项对应一个食物,那模型可以这么写:
// Aliment(食物)模型 public class Aliment { public int Id { get; set; } public string Name { get; set; } // 食物名称 public int Calories { get; set; } // 热量 // 你需要的其他属性,比如蛋白质、脂肪等 } // MealPlanner(膳食规划)模型 public class MealPlanner { public int Id { get; set; } public DateTime MealDate { get; set; } // 用餐日期 public string MealType { get; set; } // 餐次:早餐/午餐/晚餐/加餐 // 关联对应的食物 public int AlimentId { get; set; } public virtual Aliment Aliment { get; set; } }
别忘了在你的DbContext里加上这两个DbSet:
public class YourDbContext : DbContext { public DbSet<Aliment> Aliments { get; set; } public DbSet<MealPlanner> MealPlanners { get; set; } // 其他DbSet... }
2. 补充控制器的添加操作方法
你现有的是GET方法,咱们需要新增两个方法:一个用来展示添加页面(GET),一个用来处理实际的添加逻辑(POST):
2.1 GET方法:展示添加页面
这个方法会先获取用户选中的食物,然后生成一个关联该食物的MealPlanner对象,传递给视图让用户补充餐次、日期等信息:
// GET: Aliments/AddToMealPlanner/5 public ActionResult AddToMealPlanner(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } // 根据id获取要添加的食物 Aliment targetAliment = db.Aliments.Find(id); if (targetAliment == null) { return HttpNotFound(); } // 预先填充默认值,比如当前日期 var newMealPlan = new MealPlanner { MealDate = DateTime.Now.Date, AlimentId = targetAliment.Id }; // 把食物对象也带上,方便视图显示食物名称 newMealPlan.Aliment = targetAliment; return View(newMealPlan); }
2.2 POST方法:执行添加操作
这个方法接收用户提交的膳食规划信息,验证后保存到数据库:
// POST: Aliments/AddToMealPlanner [HttpPost] [ValidateAntiForgeryToken] public ActionResult AddToMealPlanner([Bind(Include = "Id,MealDate,MealType,AlimentId")] MealPlanner mealPlanner) { if (ModelState.IsValid) { db.MealPlanners.Add(mealPlanner); db.SaveChanges(); // 保存成功后跳转到膳食规划列表页 return RedirectToAction("Index", "MealPlanners"); } // 如果验证失败,重新获取食物对象返回视图 mealPlanner.Aliment = db.Aliments.Find(mealPlanner.AlimentId); return View(mealPlanner); }
3. 在食物列表页添加「添加至膳食规划器」按钮
打开你的Aliments列表视图(比如Aliments/Index.cshtml),在每一行食物的操作列里添加这个按钮:
@model IEnumerable<YourProject.Models.Aliment> <table class="table"> <tr> <th>@Html.DisplayNameFor(model => model.Name)</th> <th>@Html.DisplayNameFor(model => model.Calories)</th> <th>操作</th> </tr> @foreach (var item in Model) { <tr> <td>@Html.DisplayFor(modelItem => item.Name)</td> <td>@Html.DisplayFor(modelItem => item.Calories)</td> <td> @Html.ActionLink("查看", "Details", new { id=item.Id }) | @Html.ActionLink("编辑", "Edit", new { id=item.Id }) | @Html.ActionLink("删除", "Delete", new { id=item.Id }) | <!-- 就是这个按钮啦 --> @Html.ActionLink("添加至膳食规划器", "AddToMealPlanner", new { id=item.Id }, new { @class = "btn btn-primary btn-sm" }) </td> </tr> } </table>
4. 创建AddToMealPlanner视图
这个视图用来让用户确认食物信息,补充餐次和日期,然后提交保存:
@model YourProject.Models.MealPlanner @{ ViewBag.Title = "添加至膳食规划器"; } <h2>添加至膳食规划器</h2> @using (Html.BeginForm()) { @Html.AntiForgeryToken() <div class="form-horizontal"> <h4>确认膳食信息</h4> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <!-- 隐藏字段,传递食物ID --> @Html.HiddenFor(model => model.AlimentId) <div class="form-group"> @Html.Label("选中的食物", htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> <p class="form-control-static">@Model.Aliment.Name (@Model.Aliment.Calories 大卡)</p> </div> </div> <div class="form-group"> @Html.LabelFor(model => model.MealDate, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.MealDate, new { htmlAttributes = new { @class = "form-control", type = "date" } }) @Html.ValidationMessageFor(model => model.MealDate, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> @Html.LabelFor(model => model.MealType, htmlAttributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.DropDownListFor(model => model.MealType, new List<SelectListItem> { new SelectListItem { Text = "早餐", Value = "早餐" }, new SelectListItem { Text = "午餐", Value = "午餐" }, new SelectListItem { Text = "晚餐", Value = "晚餐" }, new SelectListItem { Text = "加餐", Value = "加餐" } }, "请选择餐次", new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.MealType, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="保存至膳食规划" class="btn btn-success" /> </div> </div> </div> } <div> @Html.ActionLink("返回食物列表", "Index", "Aliments") </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") }
5. 可选:快速添加(无需用户输入)
如果想做一个“一键添加到今日晚餐”的快速按钮,不需要用户填写表单,可以这么搞:
控制器新增POST方法
[HttpPost] [ValidateAntiForgeryToken] public ActionResult QuickAddToMealPlanner(int id) { var targetAliment = db.Aliments.Find(id); if (targetAliment == null) { return HttpNotFound(); } // 直接创建默认的膳食规划项 var quickMealPlan = new MealPlanner { MealDate = DateTime.Now.Date, MealType = "晚餐", AlimentId = id }; db.MealPlanners.Add(quickMealPlan); db.SaveChanges(); return RedirectToAction("Index", "MealPlanners"); }
列表页添加快速按钮
<!-- 在原来的按钮旁边加这个 --> @using (Html.BeginForm("QuickAddToMealPlanner", "Aliments", new { id=item.Id }, FormMethod.Post)) { @Html.AntiForgeryToken() <input type="submit" value="快速添加至今日晚餐" class="btn btn-secondary btn-sm ml-1" /> }
这样就完成啦!按照这个步骤,用户就能从食物列表里选食物,添加到膳食规划器里了。
内容的提问来源于stack exchange,提问作者Andre.A
相关产品推荐
相关产品推荐

