私はAsp.Net MVCフレームワークを使用してウェブサイトを開発しています。スタックオーバフローの最上部にあるレピュテーションバーと同様に、一般的なユーザー情報をいくつかのページに追加する必要があります。MVC - ビューに追加情報を渡す
この余分な情報をビューに追加するために、コントローラメソッドの作成にオーバーヘッドが追加されないようにすることが重要であると考えます。これはページの90%を越えて使用されている場合は
public ActionResult Index()
{
ViewData["reputationScore"] = GetUsersReputation(userId);
// main controller logic here
}
:これはViewDataを対象にこの情報を渡すか、それはすべてのコントローラはこのように見ていることになると評判のフィールドを受け入れるためのviewmodelsを修正するオプションを除外しますサイトでユーザーのバッジ数を表示したい場合は、変更するのにかなり時間がかかることがあります。
私はこの
使用マスターページに4つの解決策を考えることができます は、背後にあるマスターページのコード内のユーザーの評判を取得し、マスターページのマークアップで評判のためにマークを設置します。
短所:
- これは離れてMVCが表すすべてのものから移動しているようです。
- 代替ビューエンジン(例:剃刀など)の使用に移行することを検討していますが、これらがどの程度うまく混合するかはわかりません。
- 評判のレイアウトを制限する傾向があります。ページの中央に配置するのは難しいです。
GetUsersReputationメソッドを追加するためのHtmlHelperの拡張 これは、HTMLオブジェクトがために使用されるべきもののわずかな違反であると思われる - それだけで出力をレンダリングするが、データベースをヒットされていません。私は、この比喩の違反以外の他の重大な問題は考えられません。
上書きSystem.Web.Mvc.ViewPage オーバーライドビューページには、データベースにアクセスする方法の選択を呼び出すために使用することができるHTMLに加えて、オブジェクトを露出させます。拡張メソッドをHtmlHelperと同じ方法で追加できるようにして、新しいメソッドが必要なときに、それが適切に拡張できるようにします。これは、私たちはのようなものを書くことができる可能性があり:
<% DataAccess.GetUsersReputation() %>
すべてのメソッドあなたを保持することができ、ベースビューモデルでそれをラップし、むしろストレートビューにビューモデルを渡すよりも、ベース汎用ビューモデル を作成します。必要があります:
public ActionResult Index()
{
MyViewModel viewCoreInfo = model.GetData();
return View(new BaseViewModel<MyViewModel>(viewCoreInfo));
}
BaseViewModelは、Webページに必要な追加情報に必要なすべてのプロパティを公開することができます。例えばUsersReputation(コンストラクタでデータベースにクエリを実行するか、プロパティにアクセスするときにデータを読み込む)私はこれがMVCのメタファーをより良く維持すると思いますが、ちょっと面倒です。
- 他の誰かが最善であるよりよい解決策
- を打ち出している - あなたは、彼らが問題/効果的であったそれらを使用している場合は?
セクションはWebformsエンジンのContentPlaceHoldersと同じです。 OPが持っている問題を本当に解決するものではありません。 OPは、どのように情報がビュー/セクション/コントローラに転送されるべきであるものに置かれるのかと不思議に思っています。 – jgauffin
答えをありがとう。これは、カミソリはマスターページでマークアップを作成することはできますが、一般的には、表示ロジック以外のビューにコードを書くことは悪い習慣と考えられますが、同じ問題が残っていると思います。確かにデータアクセスメソッドを置く場所ではありません。これは実際にはモデル/コントローラの責任です。しかし、重複を避けるために、私はすべてのコントローラで評判メソッドを呼び出す必要がないようにしたいと考えています。 –
@Giles私はあなたが何を意味するかを見ます。セクションが独自のコントローラ/アクションまたはこれらの行に沿ったものを呼び出す部分ビューをレンダリングする場合はどうなりますか? – stephen776