0

すべてのコントローラーは BaseController に基づいており、それらの間でプロパティを共有し、OnActionExecuting をオーバーライドして、ルートに基づいていくつかの値を設定します。

すべてのビュー データに対して同じことを行う BaseViewData クラスを作成しています。

現時点では、ビュー データを次のように入力しています (C#):

var viewData = new BaseViewData
{
    Name = "someName",
    Language = "aLanguage",
    Category = "aCategoryName"
};

ビューデータを必要とするすべてのアクションでこれを行います。一部のプロパティは一般的で、すべてのアクションで設定する必要があります。いくつかのプロパティをよりグローバルなスケールで設定する方法はありますか?

BaseController の OnActionExecuting メソッドで BaseViewData クラスをインスタンス化する場合、通常のコントローラー (BaseController から派生) のアクションから BaseViewData プロパティにアクセスするにはどうすればよいですか?

Dennis Palmer に応じて更新します。

一部のリクエストで ViewData["lang"] がランダムに入力されないという厄介な問題のために、私は基本的にこれを行っています。ViewData["lang"] には、言語が英語の場合は "en" が含まれ、日本語の場合は "ja" が含まれます (まあ、とにかくそうなるはずです)。BaseController の OnActionExecuting 内に ViewData["lang"] を入力します。

私の見解では、言語に基づいていくつかの部分ビューを呼び出します。

<% Html.RenderPartial(ViewData["lang"] + "/SiteMenu"); %>

しかし、「/SiteMenu が見つかりません」という状態のエラーがランダムにスローされます。これは、ViewData["lang"] に値がないことを示しています。ViewData["lang"] が入力されない理由が見つかりません。そのため、強く型付けされたビュー データのみを使用するようにサイトを書き直しています (そして、いくつかのハード デフォルトを設定しています)。しかし、別の方法がより良い場合は、その方法を使用します。

ありがとうございました!

4

2 に答える 2

1

あなたがやろうとしていることを正確にフォローしているかどうかはわかりませんが、ビューがルートの値を使用して特定の情報を表示している場合は、HtmlHelper に独自の拡張メソッドを追加する方が良い方法のようです。

ルートに名前、言語、およびカテゴリが含まれていますか? その場合、HtmlHelper はルート情報にアクセスし、拡張メソッドを介して何を表示するかを決定できます。ルートとビューが知る必要があるものとの相関関係は何ですか?

更新:langあなたのルートの一部ですか? もしそうなら、ルート データを直接見て、レンダリングする部分ビューを決定する HtmlHelper 拡張メソッドを記述できると主張します。そうすれば、コントローラは ViewData["lang"] の設定について心配する必要さえありません。ビューは、ルートに基づいてレンダリングする方法を常に知っています。

更新 2:HtmlHelperルート データを再評価するため、拡張メソッドの使用を却下することは、時期尚早の最適化のケースである可能性があると思います。コントローラーの継承スキームは非常に複雑に聞こえます。設定方法ViewDataが信頼できないため、質問をしました。ルートデータから値を取得することは、設定してから読み取るよりも効率が悪いとは思いませんViewData

あなたのコメントから:

コントローラーでは、lang 値を使用して、表示するビューも決定します。

それは、より良いアドバイスをするために、あなたのシステムのもっと多くの部分を見る必要があると私に思わせるだけです. 言語ごとに個別のビューがある場合、使用する言語をビューに伝える必要があるのはなぜですか?

考慮すべきもう 1 つの代替案は、入れ子になったマスター ページを使用することです。サイト レイアウト用の 1 つのマスター ページと、ハード コードされた lang 値だけを含む各言語用の入れ子になったマスター ページを作成できます。

于 2009-12-17T00:27:11.947 に答える
1

おそらく、この継承スキームの代わりに、アクション フィルターを使用して必要なデータを追加することができます。

于 2009-12-17T00:21:19.767 に答える