2012-02-02 7 views
0

ページのリクエストが行われるたびに自分のスパークマスターレイアウトを選択する必要があります。私はこのように、ViewBag.Layoutの値をOnActionExecutingに設定し、マスターレイアウトrefでこの値を参照しようとしました。レンダリング時に動的にスパークマスターレイアウトを選択する

<use master="${ViewBag.Layout}"/> 

しかし、これは火花がなく、文字列としてではなく、コードとしてかっこ内のコードを処理されていないかのように思える、動作しません。次のエラーが表示されます。

The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched: 
~/Views/Home/Index.aspx 
~/Views/Home/Index.ascx 
~/Views/Shared/Index.aspx 
~/Views/Shared/Index.ascx 
~/Views/Home/Index.cshtml 
~/Views/Home/Index.vbhtml 
~/Views/Shared/Index.cshtml 
~/Views/Shared/Index.vbhtml 
Layouts\${ViewBag.Layout}.spark 
Shared\${ViewBag.Layout}.spark 

誰がこの理由を教えていただけますか?あるいは、これを行う別の方法を教えてください。

答えて

1

コードの構文を使用してレイアウトを動的に選択することはできません。これは、レイアウトがエンジンでレンダリングされる前に選択されるためです。最初にレイアウトが配置され、エンジンはすべての変数をレンダリングしようとします。レイアウトに変数を使用すると、レンダリングエンジンは、開くファイルを認識しません。

+0

情報をいただきありがとうございました。私は可能ではないと考えて別の解決策を選択しました – jcvandan

0

実際に。それは可能です..コード例を使用する代わりに。 ResultFilterを使用します。

public void OnResultExecuting(ResultExecutingContext filterContext) { 
     var viewResult = filterContext.Result as ViewResult; 
     if (viewResult == null) 
      return; 

     var layoutFile = viewResult.ViewBag.Layout; //the variable you set in your action executing, 

     viewResult.MasterName = layoutFile; 

    } 
関連する問題