6

私はMVCを使い慣れていないので、これは愚かな疑問です - 私は強く型付けされたビューをASPで扱おうとしています。 net mvc。私はバージョン3で作業しています。 私は2つのモデルを持つプロジェクトを持っています - 人と部署。人は部署に所属しなければなりません。その後、私は部門を参照する人のモデルを持っているASP.NET MVC3、強く型付けされたビューでもドロップダウンリストがビューバックに頼っています

public class Department 
{ 
    public int Id { get; set;} 
    public string DeparmentName { get; set;} 
} 

:だから私は、私の部署のモデルを(と私は私のコントローラとCRUDインターフェイスを生成した)持っ

public class Person 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public int Department_Id { get; set; } 
    [ForeignKey("Department_Id") 
    public virtual Department Department { get; set;} 
} 

今、私は私のコントローラとビューを生成します。私はPersonControllerに見たときに今、私は作成のために、次のいる:

public ActionResult Create() 
{ 
    ViewBag.Department_Id = new SelectList(db.Deparments, "Id", "DepartmentName"); 
    return View(); 
} 

と人\ Create.cshtmlで、ドロップダウン部門を作成するためのコードは、私のよう

@Html.DropDownList("Department_Id", String.Empty) 

ですDropDownList HtmlヘルパーがViewBagを使用してドロップダウンリストを作成しています。しかし、FirstNameとLastNameは、ViewBagに依存せずに入力フィールドを作成しているようです - 私のビューは強く型付けされていてDropDownListではないので、私のViewではFirstNameとLastNameフィールドでコンパイル時間をチェックできます。

強く型付けされていない部門のDropDownListがあるか、間違ったことをしていて強く型付けする方法がありますか?

感謝:)

答えて

5

ビュー・バインドが必要な理由は、ビューがバインドされるPersonインスタンスに、すべての可能な部門のデータが含まれていて、所属する部門が1つしかないためです。何がこの行に起こる:

ViewBag.Department_Id = new SelectList(db.Deparments, "Id", "DepartmentName"); 

はDBからのすべての部門が値としてDepartmentName ASNキーとしてIDで(あなたのドロップダウンがにバインドするために)選択リストに追加されていることです。ビューがPersonにバインドされた後、ドロップダウンに適切なDepartmentが表示されます。

+0

こんにちはエドウィン - ありがとう - 一種のPersonが一つのDepartment_IDを持っていますが、ビューは私のPerson Modelにバインディングされていると思っていました。 "仮想"プロパティ?たぶんMVCフレームワークであまりにも多くの "魔法"を探しているだけかもしれません。 – Rick

+0

@Rick:そうだと思います。ビューは、あなたのPersonによって定義された単一のDepartmentにのみバインドされます。ビューバックを使用して、部門の完全なリストを転送します。ちなみに、ViewBagは、(他の回答からの)ViewDataのラッパーであり、動的プロパティを作成することができます。 –

2

あなたは強く型付けされたビューを使用している場合、あなたはビューに渡す強く型付けされたモデルが必要です。

public class ViewData { 
    public IList<Departments> Departments {get; set;} 
} 

を次に、あなたにあなたがしているコントローラ:

public ActionResult Create() 
{ 
    ViewData model = new ViewData(); 
    model.Departments = db.Deparments; 
    return View(model); 
} 

最後に、選択リストを作成してビューにドロップします。

@model ViewData 
@SelectList list = new SelectList(Model.Deparments, "Id", "DepartmentName"); 
@Html.DropDownList("Department_Id", list); 

これは意味をなさないでしょう。

+0

こんにちはSteve - ありがと - あなたは "ViewModel"を作成したViewDataクラスですか? – Rick

+0

はい、私は一般にすべてのビューモデルをソリューションのmodelsフォルダに置きます。一般的に私はそれらの名前を{viewName} ViewData.cs – Steve

関連する問題