別々のモデルからのフィールドで構成されるフォームを作成し、送信時にデータベース内の対応するテーブルを更新したいと考えています。
どこにも答えが見つからなかったので、何かがうまくいくまでいじくり回しました。ただし、これらすべてに慣れていないため、私のソリューションの有効性には疑問があります。私の問題を述べて解決策を示すことで、私が何を必要としているのかをよりよく理解し、私の問題に対する最善の解決策を見つける手助けができることを願っています.
私はシンプルで抽象的な例が好きなので、現在取り組んでいるものは次のとおりです。
まず、カラーモデルを作成します...
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" />
}
これまでのところ、すべてが期待どおりに機能しています。個別のモデルのデータを 1 つのフォームに入力して送信することができます。データベースが更新され (色はカラー テーブルに、形状は形状テーブルに)、すべて問題ありません。実際には、互いに関連するいくつかのモデルを使用して、より長いフォームを作成します。私の現在のソリューションには、newObject.Property = viewModel.Object.Property
ステートメントでいっぱいの大きなコントローラーが必要です。それは望ましくありませんか?これを処理するより良い方法はありますか?
ありがとう!