如何使用多个相关表创建ViewModel并保存表单

时间:2012-10-18 21:59:01

标签: asp.net-mvc-4 entity-framework-5

我试图找出在现代版本中实现这一目标的最佳方法。我使用VS2012 MVC4 EF5并从我的数据库中构建了一个edmx文件。我构建了一个允许提交供应商信息的表单。主表是供应商表,主要包含联系信息,还有其他表存储他们的多个类别选项(复选框列表),另一个表存储他们的少数信息(单选按钮集合)。所以我的ViewModel是供应商表,我用查看包填充复选框和单选按钮,查询表查询查找表的值。

所以我假设我应该将类别和少数部分构建到ViewModel中并以某种方式连接魔术,以便数据库知道如何保存返回的值,或者我应该只使用viewbags然后以某种方式在post上读取这些值和循环遍历它们将它们存储到数据库中?无论哪种方式,我都被卡住了,不知道该怎么做。

我在网上有很多例子,但没有一个符合这种情况。这不是一个复杂的数据模型,但应该是相当普遍的现实世界情况。我是MVC的新手,如果我遗漏了一些明显的东西,请原谅我。

感谢任何指导。

更新:以下是将ViewModel保存到数据库的基本代码,但是如何保存复选框列表和单选按钮。我认为有两种方法1)以某种方式将它们包含在ViewModel中或2)执行单独的函数来保存表单复选框和单选按钮值。

        [HttpPost]
    public ActionResult Form(VendorProfile newProfile)
    {
        if (ModelState.IsValid)
        {
            newProfile.ProfileID = Guid.NewGuid();
            newProfile.DateCreated = DateTime.Now;

            _db.VendorProfiles.Add(newProfile);
            _db.SaveChanges();
            return RedirectToAction("ThankYou", "Home");
        }
        else
        {
            PopuplateViewBags();
            return View(newProfile);
        }
    }

也许另一种说明我的问题的方法是,如果你必须建立一个表格,人们会注册,并从31种口味的列表中选择所有他们喜欢的冰淇淋口味。您需要将人员的联系信息保存在主表中,然后将他们的风味选择集合保存在另一个表中(一对多)。我有一个用于联系表单的ViewModel和一个从查找表中显示的flavor(复选框列表)列表。你如何编写代码来保存这个表单?

1 个答案:

答案 0 :(得分:0)

解决方案:可能有更好的方法,但想发布我发现的内容。您可以传递复选框的集合,然后将它们发送到另一个处理数据库插入的方法。

        [HttpPost]
    public ActionResult Form(VendorProfile newProfile, int[] categories)
    {
        if (ModelState.IsValid)
        {
            newProfile.ProfileID = Guid.NewGuid();
            newProfile.DateCreated = DateTime.Now;

            _db.VendorProfiles.Add(newProfile);
            _db.SaveChanges();

            InsertVendorCategories(newProfile.ProfileID, categories);

            return RedirectToAction("ThankYou", "Home");
        }
        else
        {
            PopuplateViewBags();
            return View(newProfile);
        }
    }

    private void InsertVendorCategories(Guid ProfileID, int[] categories)
    {
        try
        {
            var PID = new SqlParameter("@ProfileID", ProfileID);
            var CID = new SqlParameter("@CatID", "");

            foreach (int c in categories)
            {
                CID = new SqlParameter("@CatID", c);
                _db.Database.ExecuteSqlCommand("Exec InsertVendorCategory @ProfileID, @CatID", PID, CID);
            }
        }
        catch { Exception ex; }
    }