既存の.masterページを保持して、新しいASP.NET MVC 3 Razorビューで使用することはできますか?私はこれを試しました:
@{
LayoutPage = "~/Views/Shared/Site.master";
}
そしてそれは私にこのエラーメッセージを与えます:
ファイル'〜/Views/Shared/Site.master'は存在しないか、有効なページではないため、レンダリングできませんでした。
既存の.masterページを保持して、新しいASP.NET MVC 3 Razorビューで使用することはできますか?私はこれを試しました:
@{
LayoutPage = "~/Views/Shared/Site.master";
}
そしてそれは私にこのエラーメッセージを与えます:
ファイル'〜/Views/Shared/Site.master'は存在しないか、有効なページではないため、レンダリングできませんでした。
残念だけど違う。マスターページはASPXWebFormsビューエンジンの一部であり、MVCフレームワークではないため、Razorはそれと相互運用できません。
1つのオプションは、前述のようにマスターを複製することですが、すべてのコードをコピーするのではなく、マスターページをRazorおよびASPXマスターが埋め込むことができるASPXパーシャルの束に分解することができます。次に、各ページと部分を1つずつRazorに変換し始め、最終的にASPXマスターを取り除くことができます。
これを行う方法は実際にあります。Scott Hanslemanには、このトピックに関するブログ投稿があります:http: //www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspx
少しハックですが、実行可能です。説明されているアプローチをカプセル化してさらにクリーンアップすることで、物事がどのように相互に接続されているかを気にせずにビューとコントローラーを構築できると思います。
共有フォルダで_Layout.cshtmlを探す必要があると思います...
これがaspxとrazorviewengineの比較です。
これは、かみそりでネストされたマスターページについての興味深い投稿でもあります...
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();
このプロセスを自分で行ったばかりですが、MattHawleyによるこの方法がうまく機能していることがわかりました。
このアプローチは、必要なマスターページを使用する標準のaspxページを作成することで機能します。その後、必要に応じてコンテンツプレースホルダーを追加できます。次に、使用するビューの名前を使用してRenderPartialを呼び出します。次に、コントローラからの応答が、レンダリングする実際のビューに渡されます。
これを機能させるにはもう少し配管が必要であり、コントローラーでビューをレンダリングするには拡張機能メソッドを呼び出す必要がありますが、セットアップすると非常にうまく機能します。
Razorでは、レイアウトページを使用して同じ機能を実現できます。