2

私の要件が、Webフォーム、winform、wpfフォームなどのDropDownlistのデータを別のdll(DAL、ドメインなど)から返すことであった場合。何を返しますか?

私は使用できます:

SelectListItem[]

Ilist<SelectListItem>

IEnumerable<SelectListItem> 

および同様の性質の他のものですが、「SelectListItem」がSystem.Web.Mvc名前空間に関連付けられている方法が好きではありません。多分それは私だけですが、それは少し具体的なようです。私のWebフォームはMVCを使用していない可能性がありますが、それでも機能しますか?

4

2 に答える 2

0

asp.net MVC ではないアプリケーションによって消費される可能性のあるアセンブリから SelectList を返すことは不適切であるという点で、あなた自身の質問に答えたと思います。これにより、WPF アプリケーションで System.Web.Mvc を参照する必要が生じることさえあります。

より適切なアーキテクチャは、何らかのタイプの IEnumerable を返し、それを現在のアプリケーション タイプに適したリスト項目タイプに変換することです。この変換は、何らかのアダプター層で、または拡張メソッドを介して発生する可能性があります。

于 2011-03-26T19:55:49.723 に答える
0

私は同じ問題に遭遇しました。私の解決策は、サービス層に小さなクラスを作成し、データを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>))
)

この単純なタスクには非常に複雑ですが、必要に応じて、必要なデカップリングを可能にし、他のプロパティを簡単にマップすることもできます。

于 2016-01-30T20:57:22.577 に答える