2011-02-01 18 views

答えて

15

私たちは、あなたがモデルを持っていると仮定した場合:

public class FooModel 
{ 
    public int ModelId { get; set; } 
    public string Description { get; set; } 
} 

あなたはその後FooModelSelectListItemとの間のマッピングを持つことができます:

Mapper 
    .CreateMap<FooModel, SelectListItem>() 
    .ForMember(
     dest => dest.Value, opt => opt.MapFrom(src => src.ModelId.ToString()) 
    ) 
    .ForMember(
     dest => dest.Text, opt => opt.MapFrom(src => src.Description) 
    ); 

、あなたが持っているときに、あなたのIEnumerable<FooModel>あなたは、単に希望をIEnumerable<SelectListItem>に変換:

IEnumerable<FooModel> models = ... 
IEnumerable<SelectListItem> viewModels = Mapper 
    .Map<IEnumerable<FooModel>, IEnumerable<SelectListItem>>(models); 

より現実的な例は、以下のビューモデルを持っているだろう:

public class MyViewModel 
{ 
    public string SelectedItemId { get; set; } 
    public IEnumerable<SelectListItem> Items { get; set; } 
} 

だから今、あなたのコントローラのアクションは、次のようになります。

public ActionResult Index() 
{ 
    IEnumerable<FooModel> items = ... 
    var viewModel = new MyViewModel 
    { 
     Items = Mapper.Map<IEnumerable<FooModel>, IEnumerable<SelectListItem>>(items) 
    }; 
    return View(viewModel); 
} 

とあなたの強く型付けされたビューの内部:

@Html.DropDownListFor(
    x => x.SelectedItemId, 
    new SelectList(Model.Items, "Value", "Text") 
) 
+0

ですので、リスト項目を選択する必要がありますか?ビューでモデルを作成するのではなく、ビューモデルでSelectListをどうやって作成できますか?私のビュー・モデルで常にリストを選択していたので、それを行うことができるのであれば、好奇心をそそられます。 – chobo2

+0

また、 "値"と "テキスト"は常にnullです。なぜ私は分からない。私のコードでは、モデルのリストではなく、自分のドメインオブジェクトのリストにバインドしています。だから多分これらの名前を一致させることはできません(私は "Value"や "Text"と呼ばれるものがないので)、何を使うべきかを伝える方法はありますか? – chobo2

+0

私はあなたの作成マップを使用する必要がありますね。私はそれがオプションの番号1のためだけだと思って、私はオプションの番号2を使用しています。また、 "選択"するのは何ですか?オプション? – chobo2

関連する問題