1

これまで、Modelクラスを使用して関連する値のリストを埋め込んで、ビューにDropDownListとしてレンダリングしました。例えば、私は私がするまで正常に使用しているなどの顧客、サプライヤー、などのすべての連絡先の種類が含まれているデータベーステーブルの行を参照することリポジトリクラスを使用するときのHtml.Dropdownlistの値

public class Contact { 
    ... 
    public int ContactTypeID { get; set; } 
    ... 
} 

ContactTypeIDでContactTypeプロパティを持っている連絡先のモデルクラスがあるとし今Contactクラスのプロパティには、例えば、と呼ばれる、ContactTypeList私は

<%: Html.DropDownListFor(model => model.ContactTypeID, Model.ContactTypeList, new {})%> 
以下の方法を行うことができ、強力な型指定されたビューを使用してこの方法で、次のサンプル

public IEnumerable<SelectListItem> ContactTypeList { 
    get { 
     return GetContactTypeList().Select(
      t => new SelectListItem { Text = t.Description, 
       Value = t.ContactTypeID.ToString() }); 
    } 
} 

のように

この方法は問題なく動作しますが、SoCの観点からは完全には清潔ではありません。

新しいプロジェクトでは、DI/IoCツールとしてリポジトリパターンとStructureMapを使用しています。そのため、モデルクラスには、基本データからデータを取得するリポジトリクラスへの参照がありません格納。

私はいつもコントローラとViewData/ViewBagを使用してこれらのリストをビューに渡すことができることを知っていますが、これがスコープを達成する良い方法かどうか疑問に思っていました。

あなたのプロジェクトではどのようにしていますか?結果を達成し、コードをきれいに保つ最良の方法は何ですか?我々はまた、リストを格納し、ビューでそれらを使用するためのViewDataを使用して私たちのプロジェクトでは

答えて

1

を支援するための

おかげで、その中には何の問題もありません。私が使用して私のプロジェクトビューモデルとモデルを操作するコントローラで

1

モデル:

public class ContactViewModel 
{ 
    public int ContactTypeID { get; set; } 
    public IEnumerable<SelectListItem> ContactTypeList { get; set; } 
} 

コントローラー:

public class ContactsController 
{ 
    private readonly IContactsRepository _repository; 
    public ContactsController(IContactsRepository repository) 
    { 
     _repository = repository; 
    } 

    [AutoMap(typeof(Contact), typeof(ContactViewModel))] 
    public ActionResult Index() 
    { 
     var model = _repository.GetContacts(); 
     return View(model); 
    } 
} 

AutoMap属性は、アクションフィルタがある使用しましたこれはコントローラのアクションの後に実行され、AutoMapperを使用してビュー(Contact)に渡されたモデルを対応するビューに置き換えますモデル(ContactViewModel)。あなたは私が書いたsample project structureで実際にそれを見るかもしれません。

明らかに、この連絡先のドロップダウンリストをプロジェクト全体に表示する場合は、別のコントローラと子の操作が必要です。これはHtml.Action helperで再利用されます。

+0

素晴らしいもの!! automappingの提案をありがとう:) – Lorenzo

関連する問題