1

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 を新しいアイテムを作成する代わりに、以前の既存のアイテムを参照させるにはどうすればよいでしょうか?

ご協力いただきありがとうございます!

4

2 に答える 2

0

私はあなたが犯している間違いは、ビューでドメインモデルを使用し、投稿時にモデル全体が完全にバインドされ、データベースに保存する準備ができていると想定していることだと思います。ビューでドメインモデルを使用することは可能ですが、個別のビューモデルを作成することをお勧めします。

例えば ​​:

public class ApplicationViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }

    public SelectList ApplicationTypeList { get; set; }
    public string ApplicationTypeId { get; set; }
}

あなたの見解では:

@Html.DropDownListFor(model => model.ApplicationTypeId, Model.ApplicationTypeList , "Choose...")

あなたのコントローラーで

[HttpPost]
public ActionResult Create(ApplicationViewModel model)
{
    if (ModelState.IsValid)
    {
        Application application = new Application()
        {
           Id = model.Id,
           Name = model.Name,
           ApplicationType = db.ApplicationTypes
              .First(a => a.Id == model.ApplicationTypeId);

        };
        db.Applications.Add(application);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(model);
 }

次に、ビューモデルのApplicationTypeIdが、モデル状態の検証の実際のアプリケーションタイプ部分に対応していることを検証できます。AutoMapperを使用すると、ビューモデルをドメインモデルに変換するプロセスを高速化できます。

于 2012-04-26T16:41:15.670 に答える
0

やってみました:

@Html.DropDownListFor(model => model.ApplicationType.Id, m => m.ApplicationType.Type, "Choose...")

2 番目のパラメーターの変更に注意してください。

于 2012-04-25T21:39:47.903 に答える