MVC3 と Razor の仕組みをよりよく理解するために、小さなアプリを開発しています。私は MVC3 を使用しています。すべてのコードは自動的に生成されました (T4 経由の dbContext、Add Controller 経由の Controller、EDMX モデルの Databese...)。
私のモデルでは、この単純なモデルがあります: http://i.stack.imgur.com/nyqu4.png
public partial class Application
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ApplicationType ApplicationType { get; set; }
}
public partial class ApplicationType
{
public int Id { get; set; }
public string Type { get; set; }
}
ご覧のとおり、ApplicationType は基本的に列挙型です (残念なことに、EF 4 は列挙型をサポートしていません)。したがって、私の ApplicationController には次のものがあります。
public ActionResult Create()
{
ViewBag.AppTypes = new SelectList(db.ApplicationTypes.OrderBy(c => c.Type), "Id", "Type");
return View();
}
[HttpPost]
public ActionResult Create(Application application)
{
if (ModelState.IsValid)
{
db.Applications.Add(application);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(application);
}
そして私の見解では:
@Html.DropDownListFor(model => model.ApplicationType.Id, (SelectList)ViewBag.AppTypes, "Choose...")
今、私は2つの問題に直面しています:
1) ApplicationType が設定されていない:
@Html.DropDownListFor は単純な選択のみをレンダリングするため、ID は入力されますが、以下に示すように Type プロパティは入力されません (申し訳ありませんが、私はここに新しいので画像を投稿できません)。
http://i.stack.imgur.com/96IR1.png
画像では、ID は問題ありませんが、Type が空であることがわかります。
私が間違っていることは何ですか?
2) 重複データ
2 つ目の問題は、デバッグ中に (正しいワークフロー シナリオをシミュレートして) Type プロパティを手動で入力すると、古いレジストリを参照するだけでなく、ApplicationType がデータベース内で複製されることです。
では、@Html.DropDownListFor を新しいアイテムを作成する代わりに、以前の既存のアイテムを参照させるにはどうすればよいでしょうか?
ご協力いただきありがとうございます!