14

I've recently begun migrating an ASP.NET project from .NET version 1.1 to 4.0. This system currently runs on customer site and works. When I migrate the solution via the VS wizard, I don't get any errors. The error is that no server control events work and the viewstate is always empty.

I've tried explicitly setting ViewStateMode to Enabled and AutoEventWireup to true.Unfortunately nothing works. The project is not written as a Web Application (converting does not solve the problem).

I've also check whether all server controls hav IDs set (they do).

The project has its own master page system and there is a thick layer upon System.Web.UI.Page that might break a lot of things, but so far I haven't been able to find the source of trouble.

Is there any particular setting that I should check (i.e. the default values changed since .NET 1.1) or can you give me some tips why this might happen?

EDIT 1: These are the values that get posted when clicking on a LinkButton:

CRC=-2134936892&_EVENTTARGET=MPage%24BC%24TestButton&_EVENTARGUMENT=&_VIEWSTATE=&_EVENTVALIDATION=%2FwEWAwL%2BraDpAgLB49K8AwKy8rFAt4Axk3NlUEWxrtY%2FRtaexH%2F634CkJe6G9Im5EOPXtVw%3D

EDIT 2: I've examined the custom master page mechanism closely and I found that it makes extensive use of Server.Transfer(...) method before jumping to the right page. Is this a possible cause of the missing ViewState? (then it would be strange that the EventTarget is always persisted) And more importantly, could there have been any change between 1.1 and 4.0?

4

3 に答える 3

4

このリンクをチェックしましたか?http://www.asp.net/whitepapers/aspnet4/breaking-changes

ページの奥の方で、FORMのアクションが空の場合、次のことが起こると述べられています。

  1. フォーム要素の action 属性が "" に設定された .aspx ページがブラウザーに送信されます。
  2. フォームが ASP.NET にポストされます。
  3. マネージ HTTP モジュールは、エンティティ本体の一部を読み取ります。たとえば、モジュールは Request.Form または Request.Params を読み取ります。これにより、POST 要求のエンティティ本体がマネージ メモリに読み込まれます。その結果、エンティティ本体は、IIS 7 または IIS 7.5 統合モードで実行されているネイティブ コード モジュールで使用できなくなりました。
  4. 最終的に IIS DefaultDocumentModule オブジェクトが実行され、Default.aspx ドキュメントに対する子要求が作成されます。ただし、エンティティ本体はマネージド コードによって既に読み取られているため、子要求に送信できるエンティティ本体はありません。
  5. 子要求に対して HTTP パイプラインが実行されると、.aspx ファイルのハンドラーがハンドラー実行フェーズで実行されます。
  6. エンティティ本体がないため、フォーム変数もビュー ステートもありません。そのため、.aspx ページ ハンドラーがどのイベント (存在する場合) を発生させるかを判断するために使用できる情報はありません。その結果、影響を受ける .aspx ページのポストバック イベント ハンドラーは実行されません。この動作は、次の方法で回避できます。

編集: 2 年前に 3.5 に移行したときに同様の問題が発生しました...そして、VS2005 を Web アプリ プロジェクト タイプでブリッジとして使用することでした。移行パスは次のとおりです。

  • 1.1~2.0
  • 2.0~3.5

これは私たちの最後の手段であり、このドキュメントを見つける前のことでした。

于 2012-08-06T10:30:36.653 に答える
1

これで問題が解決する場合とそうでない場合がありますが、スタックに関するこの投稿をチェックすると、本番サーバーでフォームのアクション属性が空になるのはなぜですか? フォームのアクション属性を中心に ASP.NET 3.5 sp1 で導入された重大な変更について説明しています。これは開始点になる可能性があります。

私は過去に同様のことをしなければなりませんでしたが、特に「カスタムマスターページ」機能がある場合は骨の折れるプロセスになる可能性があります (私も同じことをしなければなりませんでした)。私は本当に基本的なページを選びます - 私たちは CustomPage によって継承された BasePage を持っていました。これは、次に AdminBasePage によって継承され、次に Admin ページなどによって継承される可能性があります。可能な限りページ構築のプロセスを行い、レンダリングするまでずっと F10 キーを押すだけで、どこで 2 回呼び出されているかが表示される場合があります (これは私たちのケースでは頻繁に発生し、値が上書きされるなどの問題の原因でした)。

server.transfer の質問 "Edit 2" に応えて、このリソースhttp://www.codeproject.com/Tips/74472/ViewState-and-Server-Transfer-Best-practicesを見つけました。 viewstate と server.transfer は引き続き調和して動作します。私は毎日この質問に戻ってきます - あなたのやり方についてもっと更新してください. 心よりお見舞い申し上げます。

于 2012-08-03T09:54:50.477 に答える
1

移行が完了したら、

Web アプリケーションの場合:

チェックリストは次のとおりです。

  1. Visual Studio 2010 のデザイン モードで .NET サーバー コントロールの値を変更してみてください。これにより、デザイナーはサーバー側のデザイナー コードを生成する必要があります。

  2. 必ずソリューションをクリーンアップして再構築してください。以前は同様の問題があり、デザイナーからデザインを変更した後に修正されていましたが、エラーが発生することがありました。移行中にエラーは発生しませんでした。

  3. フォームを保存してテストします。

  4. Firefox の Firebug を使用して、Web ページの読み込み時に JavaScript スクリプト エラーがないかどうかを確認します。

    これが役立つことを願っています。

于 2012-08-03T10:02:59.147 に答える