1

我想创建一个由来自不同模型的字段组成的表单,然后在提交时更新数据库中的相应表。

我在任何地方都找不到答案,所以我在做一些事情之前一直在修补。然而,对所有这些都是新手,我怀疑我的解决方案的有效性。我希望通过陈述我的问题并展示我的解决方案,您可以更好地了解我的需求,并能够帮助我找到解决问题的最佳解决方案。

我喜欢简单、抽象的例子,所以这就是我目前正在做的事情:

首先,我制作了一个颜色模型...

namespace example.Models
{
    public class Color
    {
        public int ColorID { get; set; }
        public string Name { get; set; }
    }
}

然后我做一个形状模型......

namespace example.Models
{
    public class Shape
    {
        public int ShapeID { get; set; }
        public string Name { get; set; }
    }
}

接下来,我制作了一个简单的 ViewModel...

namespace example.ViewModels
{
    public class ColorAndShapeViewModel
    {
        public Color Color { get; set; }
        public Shape Shape { get; set; }
    }
}

这是我的 DbContext ...

namespace example.DAL
{
    public class MyContext : DbContext
    {
        public DbSet<Color> Colors { get; set; }
        public DbSet<Shape> Shapes { get; set; }
    }
}

接下来,控制器...

namespace example.Controllers
{
    public class MyController : Controller
    {
        private MyContext db = new MyContext();

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(ColorAndShapeViewModel viewmodel)
        {
            Color newColor = new Color();
            newColor.Name = viewmodel.Color.Name;

            Shape newShape = new Shape();
            newShape.Name = viewmodel.Shape.Name;

            db.Colors.Add(newColor);
            db.Shapes.Add(newShape);
            db.SaveChanges();

            return RedirectToAction("Index");
        }

    }
}

最后,观...

@model example.ViewModels.ColorAndShapeViewModel

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    @Html.LabelFor(model => model.Color.Name)<br />
    @Html.TextBoxFor(model => model.Color.Name)<br />
    <br />
    @Html.LabelFor(model => model.Shape.Name)<br />
    @Html.TextBoxFor(model => model.Shape.Name)<br />
    <br />
    <input type="submit" value="Create" />
}

到目前为止,一切都按预期工作:我能够将不同模型的数据输入到一个表单中并提交。数据库已更新(颜色进入颜色表,形状进入形状表),一切都很好——或者是吗?实际上,我将使用多个相互关联的模型来制作更长的表格。我目前的解决方案将需要一个大型控制器,充满newObject.Property = viewModel.Object.Property语句。这不是不可取吗?有没有更好的方法来处理这个?

谢谢!

4

0 回答 0