我是学生,需要申请上学。 这是餐厅的预订申请。 我想为菜单创建一个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'不包含'添加'的定义
任何人都可以帮我这个吗?
答案 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对象的状态。如果需要组合菜单项,可以向所述视图模型对象添加属性并从那里开始。