使用另一个模型的下拉列表为菜单创建菜单的创建视图

时间:2014-11-16 13:09:14

标签: c# view model asp.net-mvc-5

我是学生,需要申请上学。 这是餐厅的预订申请。 我想为菜单创建一个Create视图,您可以在其中为菜单命名,然后选择此菜单需要的菜肴。这些菜肴存放在另一个模型中。 我正在使用这个问题:Create a Dropdown List for MVC3 using Entity Framework (.edmx Model) & Razor Views && Insert A Database Record to Multiple Tables但不能让它发挥作用。 这是我的模特:

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'不包含'添加'的定义

任何人都可以帮我这个吗?

1 个答案:

答案 0 :(得分:1)

您的错误是因为Menu上没有MenusController属性,即您尚未声明任何名为Menu的内容。看起来你正试图在MenuAddController上使用Menu对象,但它显然不存在于MenusController中,因为它是一个完全不同的类。

通过类的名称,您可能无法完全掌握MVC模式。你的MenuAddController看起来像是在尝试成为一个视图模型,也可能是一个存储库 - 我无法确定你的意图是什么。好消息是MenusController就在那里。它唯一缺少的是一种将菜单(被添加的东西)保存/保存到数据库的方法。

让我们从MenusController开始,因为你似乎最接近完成。如上所述,数据访问是所有缺失的。我会考虑在控制器类中添加BonTempsDbContext属性,或者至少在Add(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属性的方式生成的,那可能就这么简单。这样,您可以在Add动作中重用(几乎总是一件好事)MenuAddViewModel对象。您将其传递给GET视图,它有助于填充空表单,然后用户提交(POST)到“post”视图和POOF,数据上下文可以将其保存到数据库或任何地方。

我正在描述的新视图模型对象不需要数据上下文对象,因为它只需要知道Menu对象的状态。如果需要组合菜单项,可以向所述视图模型对象添加属性并从那里开始。