为菜单创建“创建”视图,其中包含来自菜肴的另一个模型的下拉列表

本文关键字:创建 另一个 下拉列表 模型 菜单 视图 包含 | 更新日期: 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 对象的状态。如果需要组合菜单项,则可以将属性添加到所述视图模型对象并从那里开始。