私は同じ問題に遭遇しました。私の解決策は、サービス層に小さなクラスを作成し、データをSelectListItem
ビューの s にマップすることでした。コード例:
1) サービス層のサロゲート クラス:
public class SelectListItemBase
{
public String Value { get; set; }
public String Text { get; set; }
}
2) ビュー モデル:
public class FetchWordsIntegrationViewModel
{
public IList<SelectListItemBase> WordTypes { get; private set; }
public FetchWordsIntegrationViewModel()
{
WordTypes = new List<SelectListItemBase>();
WordTypes.Add(new SelectListItemBase() { Value = "0", Text = Constants.Ids.SelectionListDefaultText });
WordTypes.Add(new SelectListItemBase() { Value = ((int)FetchedWordType.ProperNoun).ToString(), Text = "Proper noun" });
// other select list items here
}
}
3) アクション内のコード
public ActionResult Index()
{
var vm = theService.CreateViewModel();
return View(vm);
}
4) AutomapperSelectListItem
を使用したマッピング ( s は LINQ を使用して簡単に生成できるため、これは必須ではありません)
Mapper.CreateMap<SelectListItemBase, SelectListItem>();
5) 最後に、ビューからのコード
@Html.DropDownListFor(m => m.WordTypes,
(IEnumerable<SelectListItem>)Mapper.Map(
Model.WordTypes,
typeof(IList<SelectListItemBase>),
typeof(IList<SelectListItem>))
)
この単純なタスクには非常に複雑ですが、必要に応じて、必要なデカップリングを可能にし、他のプロパティを簡単にマップすることもできます。