5

何よりもまず、ビューでサーバー側のコントロールにアクセスすることは、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は、サーバー側のイベントをコントローラー クラスで初期化してトラップすることです。ただし、ビュー内のコントロールの状態をシリアル化することは避けたいと思います。単にそれをコントローラーに渡して、可能であれば元に戻しますか?

アドバイスをよろしくお願いします!

4

2 に答える 2

5

なんてこった!! これを投稿してから10分後に解決策を見つけました。

修正は、プロジェクトを右クリックして「Web アプリケーションに変換」と言って、CodeBehind クラスを「部分」に戻すことでした。すべてのコントロールは、コード ビハインドからアクセスできるようになりました。

読んでくれてありがとう。私の質問/回答がいつか誰かの役に立てば幸いです。:)

于 2009-06-18T20:41:37.410 に答える
0

何かを MVC に移植して、その半分を従来の WebForms に保持する意味がわかりません。

このアプローチは、将来の開発者が両方のテクノロジに精通している必要があることを意味し、私の意見ではクリーンではありません。

私はどちらか一方を選び、2 つを混ぜないようにします。

于 2009-06-18T20:43:35.800 に答える