多くのレガシーWebフォームページがあるプロジェクトにMVCを追加しています。これは正常に機能します。ただし、現在、MVCとWebフォーム用に別々のマスターページがあります。 2つのマスターページは本質的に同じ出力を生成します。 Webフォームを1つ削除して、すべてのページでMVCマスターページを使用し、DRYを維持したいと思います。
両方を変更するのを忘れたとき、DRYではない)はすでに数回私を噛みました。
わかりやすい方法で、WebフォームコンテンツページのMasterPage属性をMVCマスターページに向けてみました。これにより、MVCマスターはMVCビューでのみ機能するというエラーがスローされます。
これは、MVCとWebフォームが混在するプロジェクトではかなり一般的な問題のようです。私のMVCマスターはViewDataで何もしていないので、Webフォームがそれらを使用できなかった理由はわかりません。
絶対に同じマスターページを共有できます。 MVCマスターページは、MasterPageFile属性を介してWebFormsマスターページを指す必要があります。これにより、WebFormsMasterPageスタイルがMVCMasterPageに適用されます。
私はこのセットアップを本番環境で使用しています。
Webフォームマスターページを指すMVCマスターページでの宣言:
<%@ Master Language="C#" MasterPageFile="~/MasterPage/Site.Master"
AutoEventWireup="true" Inherits="System.Web.Mvc.ViewMasterPage" %>
チャームのように機能します。
この ブログ投稿 は、WebFormとMVCマスターページをほとんどまたはまったく複製せずに共有するために必要な手順を説明します。ダウンロードできるサンプルプロジェクトも含まれており、非常に役に立ちました。
私が遭遇した問題の1つは、ヘッダーでLoginStatusコントロールを使用していたことです。 LoginStatusはフォーム内にある必要があるため、ルートマスターページで使用できませんでした(すべてのMVCページでフォームがネストされたくない)。しかし、それは私のルートマスターページの単純なコードブロックに置き換えるのは非常に簡単なコントロールでした。
私のWebフォームアプリでは、マスターページは「HLPUSD.SMART.SMARTMaster」を継承しています。これは、アプリケーションの名前空間であり、Webフォームクラスの名前です。
私のMVCプロジェクトでは、マスターページは「System.Web.Mvc.ViewMasterPage」から継承しています
私はこれがそれと関係があると思いますか?