为菜单创建“创建”视图,其中包含来自菜肴的另一个模型的下拉列表
本文关键字:创建 另一个 下拉列表 模型 菜单 视图 包含 | 更新日期: 2023-09-27 18:30:31
我是学生,需要申请入学。这是餐厅的预订申请。我想为菜单创建一个"创建"视图,您可以在其中为菜单命名,并选择此菜单需要包含的菜肴。这些菜肴存储在另一个模型中。我正在使用这个问题:使用实体框架(.edmx模型)和Razor视图&&将数据库记录插入多个表,但不能使其工作。这是我的模型:
public class MenuAddController
{
private BonTempsDbContext db = new BonTempsDbContext();
public Menu Menu { get; set; }
public Dictionary<int, string> Voorgerechten { get; set; }
public Dictionary<int, string> Hoofdgerechten { get; set; }
public Dictionary<int, string> Nagerechten { get; set; }
public MenuAddController() { }
public MenuAddController(int id)
{
Menu = db.Menu
.Where(e => e.id == id).SingleOrDefault();
// instantiate your dictionaries
foreach (var Voorgerecht in db.Voorgerecht)
{
Voorgerechten.Add(Voorgerecht.id, Voorgerecht.description);
}
foreach (var Hoofdgerecht in db.Hoofdgerecht)
{
Hoofdgerechten.Add(Hoofdgerecht.id, Hoofdgerecht.description);
}
foreach (var Nagerecht in db.Nagerecht)
{
Nagerechten.Add(Nagerecht.id, Nagerecht.description);
}
}
}
这是我的控制器。
public class MenusController : Controller
{
// GET: Menus
public ActionResult Index()
{
return View();
}
[HttpGet]
public ActionResult Add()
{
return View(new MenuAddController());
}
[HttpPost]
public ActionResult Add(MenuAddController vm)
{
if (ModelState.IsValid)
{
Menu.Add(vm.Menu); <--- this is the error line
return View("Index"); // or wherever you go after successful add
}
return View(vm);
}
}
它给出了一个错误
Menu.Add(vm.Menu);
错误 1 "BonTempsMVC.Menu" 不包含"添加"的定义
有人可以帮助我吗?
你的错误是因为MenusController
上没有Menu
属性,即你没有声明任何叫做Menu
的东西。看起来您正在尝试在 MenuAddController 上使用 Menu 对象,但它显然不存在 MenusController 中,因为它是一个完全不同的类。
根据类的名称,您可能没有完全掌握 MVC 模式。您的MenuAddController
看起来像是试图成为一个视图模型,也可能是一个存储库 - 我不能确定你的意图是什么。好消息是MenusController
就在那里。它唯一缺少的是一种将菜单(正在添加的内容)保留/保存到数据库的方法。
让我们从MenusController
开始,因为您似乎最接近完成那里。如前所述,数据访问是所缺少的全部。我会考虑向控制器类添加一个 BonTempsDbContext
属性,或者至少在添加 (POST) 操作中实例化一个属性,例如
public class MenusController
{
private BonTempsDbContext db = new BonTempsDbContext();
// actions and stuff
}
或在动作本身中,例如
[HttpPost]
public ActionResult Add(SomeViewModel vm)
{
var db = new BonTempsDbContext();
// check model state, etc
// db.Menus.Add(vm.Menu)
}
我看到的唯一另一个奇怪之处是 GET Add 操作。您的变量名称表明您正在向其传递控制器,这在 MVC 上下文中毫无意义。我最常看到的约定是传递一个空的视图模型对象(下面将进行一些描述)来设置要发布到操作的 POST 版本的表单。
这是不完整的(有点伪代码),因为你提到这是家庭作业!
现在进入其他位。MenuAddController 作为对象或名称(对我来说)没有任何意义,所以让我们考虑一个名为 MenuAddViewModel
的新对象,它表示要添加的 Menu 对象的状态,即当用户提交表单(您尚未显示)时,ASP.NET MVC 将为您绑定的对象。也许所述视图模型对象上有一个 Menu 属性,这就是您计划保存到数据库的内容,例如
public class MenuAddViewModel
{
public Menu Menu { get; set; }
// ...
}
如果窗体是以 MVC 可以自动绑定 Menu 属性的方式生成的,则可能就这么简单。这样,您可以在两个"添加"操作中重用 MenuAddViewModel 对象(几乎总是一件好事)。你把它传递给GET视图,它有助于填充一个空的表单,然后用户提交(POST)到"post"视图和POOF,数据上下文可以将其保存到数据库或任何位置。
我描述的新视图模型对象不需要数据上下文对象,因为它只需要知道 Menu 对象的状态。如果需要组合菜单项,则可以将属性添加到所述视图模型对象并从那里开始。