2010-12-13 1 views
1

Asp.Net MVC2上にホワイトラベルのプラットフォームが構築されています。現在のところ、サイトには6つのコントローラーと、すべてのコアビューなどがあり、これをそのまま使用することができます。これまでに5つのサイトを構築してきました。既存のMVCサイトを拡張して、すべてのアクションで新しいデータをViewDataに渡します。

しかし、私は、すべてのビューからすべてのビューに新しいデータ(ViewDataディクショナリで問題ありません)を渡す必要があるということを意味します。このデータはクエリ文字列から、次にクッキーからシードされます。

この主な理由の1つは、このデータの値に応じてサイトのマスターページに余分な画像を追加できることです。もちろん、私は本当に汚れていて、マスターページに非直列化コードを置くことができます。私はむしろコントローラの継承とアクションメソッドのオーバーライドを含まないのすべての要求に対してViewDataに確実に追加する方法を見つけ出します。(!)

どのようなアイデアも大いに感謝しています!その後、

public class AdditionalViewDataInjectorAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     base.OnActionExecuted(filterContext); 
     filterContext.Controller.ViewData["foo"] = "bar"; 
    } 
} 

そして、この属性を使用してベースコントローラを飾る:

答えて

4

カスタムアクションフィルター属性を記述し、ベースコントローラまたはこの情報が注入されている必要があり、すべてのアクションにこの属性を適用することができ

[AdditionalViewDataInjector] 
public class BaseController: Controller { } 

ASP.NET MVC 3には、global action filtersという概念があり、ベースコントローラを持つ必要はなく、このフィルタですべてのアクションを飾る必要もありません。 workaround allowing you to achieve the same in ASP.NET MVC 2があります。これですべてのビューがビューデータにこの追加のプロパティを取得します。

これは、以前は醜い回避策であり、私が推奨するものではない(ViewDataは醜いです)。 Html.Action and Html.RenderActionヘルパーをご覧ください。ここでは、これがどのように見えるかです:

public class MySpecialController: Controller 
{ 
    public ActionResult Index() 
    { 
     // Here you have access to the request, cookies, session, routes, ... 
     var someModel = GetSomeModel(); 
     return View(someModel); 
    } 
} 

は、その後、いくつかのことを強く要求されるHTML(~/Views/MySpecial/Index.ascx)を含有し、最終的に自分のマスターページでこれを含めるなる部分入力した:

<%= Html.Action("index", "myspecial") %> 
+0

Genius - 後者の子アクションを使用するソリューションは絶対に動作しますサイトが既にどのようにスタックしているかに完璧にフィットしています。私は、カスタムモデルのバインダー(クッキーとクエリ文字列と相互作用する)を使用するアクションメソッドパラメーターとしてデータを取得します。このバインダーはコンテンツの部分ビューを起動し、バインドされたオブジェクトを単にモデルとして渡します。その後、マスターはただ1行のHtml.RenderAction()を使用し、すべてのページで動作します。ありがとう:) –

0

オーバーライドOnResultExecutingあなたのベースコントローラにViewDataプロパティに必要なデータを追加します。

public override void OnResultExecuting(ResultExecutingContext ctx) { 
    ViewData["title"] = "Hello world!"; 
    base.OnResultExecuting(ctx); 
} 
関連する問題