我想创建一个由来自不同模型的字段组成的表单,然后在提交时更新数据库中的相应表。
我在任何地方都找不到答案,所以我在做一些事情之前一直在修补。然而,对所有这些都是新手,我怀疑我的解决方案的有效性。我希望通过陈述我的问题并展示我的解决方案,您可以更好地了解我的需求,并能够帮助我找到解决问题的最佳解决方案。
我喜欢简单、抽象的例子,所以这就是我目前正在做的事情:
首先,我制作了一个颜色模型...
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
语句。这不是不可取吗?有没有更好的方法来处理这个?
谢谢!