MVCプロジェクトのコードビハインドでサーバー側のコントロールにアクセスするにはどうすればよいですか?
-
06-07-2019 - |
質問
何よりもまず、ビューでサーバー側のコントロールにアクセスすることは、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の基本的なもの...
私がやろうとしていることは可能ですか? might
が機能すると考えたもう1つのアプローチは、コントローラークラスのサーバー側イベントを初期化してトラップすることです。ただし、ビュー内のコントロールの状態をシリアル化することは避けたいです。可能な場合は、単にコントローラーに渡し、元に戻しますか?
アドバイスをありがとうございます!
解決
聖なるがらくた!!これを投稿してから10分後に解決策を見つけました。
修正したのは、プロジェクトを右クリックして「Webアプリケーションに変換」と言うことでした。 CodeBehindクラスを「部分」に戻します。すべてのコントロールにコードビハインドからアクセスできるようになりました。
読んでくれてありがとう。私の質問/回答がいつか他の人に役立つことを願っています。 :)
他のヒント
従来のWebFormsの半分を保持するためだけに、MVCに何かを移植することには意味がありません。
このアプローチは、将来の開発者が両方のテクノロジーに精通する必要があることを意味し、私の意見ではクリーンではありません。
どちらか一方と一緒に行き、2つが混ざらないようにします。