既存の.masterページを保持して、新しいASP.NET MVC 3 Razorビューで使用することはできますか?私はこれを試しました:
@{
LayoutPage = "~/Views/Shared/Site.master";
}
そしてそれは私にこのエラーメッセージを与えます:
ファイル '〜/ Views/Shared/Site.master'は存在しないか、有効なページではないため、レンダリングできませんでした。
残念だけど違う。マスターページはASPX WebFormsビューエンジンの一部であり、MVCフレームワークではないため、Razorはそれと相互運用できません。
1つのオプションは、前述のようにマスターを複製することですが、すべてのコードをコピーするのではなく、マスターページをRazorマスターとASPXマスターが埋め込める一連のASPXパーシャルに分解できます。次に、各ページとパーシャルを1つずつRazorに変換し、最終的にASPXマスターを削除できます。
実際にこれを行う方法があります。 Scott Hanslemanがこのトピックについてブログ投稿しています: http://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspx
それは少しハックですが、実行可能です。ここで説明したアプローチはカプセル化してさらにクリーンアップできるため、物事がどのように接続されているかを気にすることなくビューとコントローラーを構築できると思います。
共有フォルダーで_Layout.cshtmlを探す必要があると思います...
これがaspxとかみそりのビューエンジンの比較です...
これは、かみそりでネストされたマスターページに関する興味深い投稿でもあります...
HTH
MVCは.Netユーザーコントロールを公式にサポートしていませんが、それらによって生成されたHTMLを取得できます。次のコードは、数十のASCXファイルで構成されるページから生成されたHTMLを取得します。
コード例:
try{
using (WebClient client = new WebClient())
{
client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
myHTML = client.DownloadString("http//www.mysite.com/header.aspx");
}
} catch ( WebException exception )
{
using(var reader = new StreamReader(exception.Response.GetResponseStream())){
Response.Write(reader.ReadToEnd());
}
}
@Html.Raw(myHTML ); //OR Response.Write(myHTML);
@RenderBody();
私自身、このプロセスを経たばかりだったので、 Matt Hawleyによるこの方法 が効果的であることがわかりました。
このアプローチは、必要なマスターページを使用する標準のaspxページを作成することで機能します。その後、必要に応じてコンテンツプレースホルダーを追加できます。次に、使用するビューの名前を指定してRenderPartialを呼び出します。コントローラからの応答は、レンダリングする実際のビューに渡されます。
これを機能させるにはもう少し配管が必要であり、コントローラーでビューをレンダリングするために拡張メソッドを呼び出す必要がありますが、セットアップすると非常にうまく機能します。
Razorでは、レイアウトページを使用して同じ機能を実現できます。