何よりもまず、ビューでサーバー側のコントロールにアクセスすることは、MVC では嫌われていることを知っていることを述べさせてください。ただし、私の状況では必要です(私が見る限り)。これが私の話です。:)
Web アプリケーションで使用しているサードパーティ コントロールがあります。私は現在、WebForms ソリューションを MVC に移植するタスクを与えられています。この特定のサード パーティの Web コントロールには WebForms アーキテクチャが必要なので、WebForms プロジェクトと同じコードを使用しようとしています。
私の最初のアプローチは、2 つの Web サイト (WebForms サイトと MVC サイト) を用意し、MVC 側から iFrame を使用して 2 つをリンクすることでした。それが機能することはわかっていますが、この特定のコントロールを使用するだけでは少しやり過ぎでした. さらに調査を行った結果、MVC プロジェクト内で WebForms アーキテクチャを使用して「男の子を混ぜ合わせる」ことができることを発見しました。したがって、私が取った新しいアプローチは、このサード パーティ コントロールを使用するページのみを特定のディレクトリ (つまり、'View\SomeDir\WebForms') にコピーし、global.asax ファイルでそのディレクトリを無視することです。 MVC ルーティング システムがそれを取得しないこと:
routes.IgnoreRoute("View\SomeDir\WebForms\{*pathInfo}");
残念ながら、ASPX ページを MVC プロジェクトにコピーしたところ、CodeBehind がページ上のコントロールへのアクセスを許可していないことがわかりました。設定方法は次のとおりです。
<%@ Register
Assembly="..."
Namespace="..."
TagPrefix="custom" %>
<custom:SomeControl ID="customControl" runat="server" />
私のコードビハインドは次のようになります。
public class MyPage : Page
{
protected void Page_Load(object sender, EventArgs args)
{
Debug.WriteLine(customControl.ID); // <-- COMPILE ERROR: Cannot resolve symbol 'customControl'
}
}
残念ながら、CodeBehind のすべてのコントロールでこのエラーが発生するため、プロジェクトはコンパイルされません。他のコントロール (つまり、ラベル、パネル、テキスト ボックスなど) をクライアント タグに変換することは問題ではありませんが、コード ビハインドでこのカスタム コントロールにアクセスして、(サーバー側の) イベントに応じて応答します。基本的な WebForms のもの...
私がやろうとしていることは可能ですか?その作業について私が考えたもう 1 つの方法might
は、サーバー側のイベントをコントローラー クラスで初期化してトラップすることです。ただし、ビュー内のコントロールの状態をシリアル化することは避けたいと思います。単にそれをコントローラーに渡して、可能であれば元に戻しますか?
アドバイスをよろしくお願いします!