MVCプロジェクトのコードビハインドでサーバー側のコントロールにアクセスするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1014987

質問

何よりもまず、ビューでサーバー側のコントロールにアクセスすることは、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つが混ざらないようにします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top