2

プロジェクト内のすべてのコントローラは、エンティティ モデルのプロパティを持つベース コントローラから継承します。

世界の都市を表示するビューがあり、国でフィルター処理するオプションがあるとします。国フィルターは、データベースからの国のドロップダウン リストです。ドロップダウン リストの Html ヘルパーは、IEnumerable<SelectItem>.

その情報で、HtmlHelper次のようなを作成しても問題ありませんか。

    public static IEnumerable<SelectListItem> GetCountries(HtmlHelper htmlHelper)
    {
        return (from c in ((BaseController) htmlHelper.ViewContext.Controller).Entities.Countries
                orderby c.Name
                select new SelectListItem() {Text = c.Name, Value = c.ID});


    }

問題は、それが可能かどうかではなく、MVC のやり方で問題ないかどうかです。(または、コントローラー内の ViewData に国のコレクションを配置する必要がありますか?)

4

3 に答える 3

3

データをパラメーターとして GetCountries メソッドに渡します。htmlHelper 関数は、ベース コントローラのプロパティを認識すべきではありません。ベースから継承されていないコントローラで誰かがそれを使用した場合はどうなるでしょうか。私は知っています、あなたはコードを制御します、何とか何とか。ベスト プラクティスに本当に関心がある場合は、依存関係を避けてください。

public static IEnumerable<SelectListItem> GetCountries(this HtmlHelper html, Countries countries) {
    return from c in countries
           order by c.Name
           select new SelectListItem 
           {
               Text = c.Name,
               Value = c.ID
           };
}

次に、あなたのビューで:

<%=Html.GetCountries(this.Entities.Countries)%>
于 2009-05-19T07:04:17.143 に答える
1

ViewModel パターンを確認してください。NerdDinner チュートリアルで言及されています: http://nerddinnerbook.s3.amazonaws.com/Part6.htm

基本的に、ビューに必要なすべてのデータをカプセル化する ViewModel クラスを作成します。したがって、すべての都市や国、およびコントローラーアクションでインスタンス化/入力されたその他のリストを含むクラスがあります。

次に、ViewModel クラスを使用するようにビューを厳密に型指定すると、フォームに必要なすべてのデータが得られます。

于 2009-05-19T14:00:04.327 に答える
0

htmlヘルパーはhtmlを返す必要があると思います。したがって、2つのアプローチがあります。

まず、開始時にこれを実行する場合は、htmlhelperから要素のリストを準備してから、初期化されたリスト、選択された要素などを使用してhtml.RenderDropDownを呼び出します。

次に、モデルですべての準備を行うことができるため、コントローラーは必要なすべての要素を含む開始されたオブジェクトを渡すため、ビューでrenderdropdownを直接呼び出すことができます

乾杯

于 2009-05-20T14:37:15.430 に答える