-
Notifications
You must be signed in to change notification settings - Fork 0
MS_ASPXDesignerGeneration
-
復元する場合と変換(移行)する場合がある。
-
以前、「Webアプリケーションへ変換」と
言う操作が Visual Studio にありましたケド、
アレ、最近の Visual Studio で、使えなくなってませんかね?
補足(原文の疑問への回答:メニューは今もある): 「使えなくなって
ませんかね?」という問いに答えておくと、
「Web アプリケーションに変換」は現在も存在する。
ただし表示条件が分かりにくい。【表示されるための条件】 ① プロジェクトが【Web アプリケーション プロジェクト】であること → Web サイト プロジェクトでは出ない ② ソリューション エクスプローラーで 【プロジェクト、フォルダ、または .aspx ファイル】を選択していること → コード ビハインド(.aspx.cs)を選んでいると出ない ★ ③ [プロジェクト] メニュー、または右クリックのコンテキスト メニュー → VS のバージョンによってどちらかに寄る原文が「メニューの位置が変更されていたもよう」と書いている通り、
VS のバージョンごとに場所が動いてきたため、
「なくなった」ように見えたと考えられる。現在(VS 2022)での確認手順:
ソリューション エクスプローラーで【.aspx ファイルを右クリック】 → [Web アプリケーションに変換] または 【プロジェクト ノードを選択】した状態で → [プロジェクト] メニュー → [Web アプリケーションに変換]なお、
.aspx.designer.csは
ASP.NET Web Forms 固有の仕組みであり、
ASP.NET Core には存在しない。
本ページは既存資産の保守・移行時に必要な知識である。
*.aspx.designer.cs(vb) をロストした場合など、以下の方法で復元できる。
-
同名の空の Web フォームを作成
-
以下の3つのファイルが作成される。
- (1) *.aspx
- (2) *.aspx.cs(vb)
- (3) *.aspx.designer.cs(vb)
-
初めに、(2) のコード・ビハインドにコードを移植する。
-
次に、(1) の ASPX ファイルの
-
@Page ディレクティブ部分を修正する。
<%@ Page Language="C#" MasterPageFile...- Inherits、MasterPageFile 属性を必要に応じて修正する。
- CodeFile 属性であった場合、CodeBehind 属性に変更する。
-
ASP タグ部分を VS のデザイナ(ソース)上で移植する。
- この操作は、必ず Visual Studio 経由で行う。
-
Visual Studio 外のメモ帳などを使用すると、
*.aspx.designer.cs(vb) が復元されない。
-
補足(なぜ VS 経由でないと駄目なのか): この注意点が
本ページで最も重要な実務知識である。理由を補っておく。【*.aspx.designer.cs の正体】 ASPX 上の runat="server" なコントロールに対応する 【protected フィールドの宣言だけ】を持つファイル partial class Default2 { protected global::System.Web.UI.WebControls.TextBox TextBox1; protected global::System.Web.UI.WebControls.Button Button1; } ↑ コード ビハインドから TextBox1 を参照できるのはこれのおかげ 【誰が生成するのか】 Visual Studio の【デザイナ(ASPX パーサ)】である → MSBuild でもなく、コンパイラでもない → 【VS が ASPX の保存を検知したときに再生成】する 【メモ帳で編集すると】 VS がその変更を知らない → designer が古いまま → 「TextBox1 は現在のコンテキストに存在しません」 というコンパイル エラーになる ★VS 外で ASPX を編集してしまった場合の復旧:
① VS で当該 .aspx を開き、何か 1 文字加えて保存 → 元に戻して保存 → 多くの場合、これで再生成される ② それでも駄目なら、[Web アプリケーションに変換] を実行 ③ 最終手段として、designer を手で書く (フィールド宣言だけなので、書けなくはない)Git のマージ競合でも同じ問題が起きる。
.designer.csは生成物なので、競合したら再生成するのが正しく、
手でマージすると ASPX と不整合になる。
- 最後に、(3) のデザイナ・ファイルを確認する。
すると、ASPX ファイルに追加したコントロールの復元を確認できる。
Web サイト → アプリ移行時、*.aspx.designer.cs(vb) を簡単に生成できる。
-
Web アプリケーションのフォルダ以下に
Web サイトの *.aspx、*.aspx.cs(vb) を配置する。 -
ソリューション・エクスプローラで
[すべてのファイルを表示]を選択しておく、 -
配置した *.aspx を右クリックし
[プロジェクトに含める]を選択する。 -
ソリューション・エクスプローラで
当該プロジェクトを選択した状態で、 -
[メニュー]の[プロジェクト]中に
- Convert to Web Application
- Web アプリケーションに変換
が存在するので、コレを選択する。
(メニューの位置が変更されていたもよう)
補足(Web サイト → Web アプリの変換で他に必要な作業): designer の
生成以外にも、変換時に手を入れる箇所がある。
項目 Web サイト Web アプリケーション コンパイル単位 ページ単位(実行時に動的コンパイル) プロジェクト単位(1 つの DLL) @Pageの属性CodeFileCodeBehind★プロジェクト ファイル なし .csproj/.vbprojが要る名前空間 付けないことが多い 必要( Inheritsと一致させる)App_Codeフォルダ特別扱いされる 普通のフォルダになる(要修正) 参照の解決 Binに置くだけプロジェクト参照 / NuGet 【変換時に踏みやすい問題】 ① App_Code の中のクラスがビルド対象にならない → ビルド アクションを [コンパイル] に変更する ② ページ間で型を参照していた箇所が壊れる → Web サイトでは動的コンパイルで解決していた ③ 名前空間がないためクラス名が衝突する → 名前空間を付け、Inherits も合わせる ④ 動的コンパイルに依存した実装(Reflection でページ型を取得等)なぜ Web アプリケーションにするのかという理由も
押さえておく(ASP.NETの構成(Webサイト・Webアプリ))。・ビルド時にコンパイル エラーが分かる(実行するまで分からない、を防ぐ) ・単体テストが書ける(プロジェクト参照できる) ・配置が単純(DLL を置くだけ。ソースを置かない=ソース流出を防ぐ) ・初回アクセスが速い(動的コンパイルが不要) ・CI/CD に載せやすい ★ 現在はこれが決定的
Default2.aspx(VB)の例
以下の様にプロジェクト・ファイルに
3つのファイルがセットであることを示す
定義が追加されている必要がある。
<Compile Include="Default2.aspx.vb">
<SubType>ASPXCodeBehind</SubType>
<DependentUpon>Default2.aspx</DependentUpon>
</Compile>
<Compile Include="Default.aspx.designer.vb">
<DependentUpon>Default.aspx</DependentUpon>
</Compile>移行メモ(原文のサンプルでファイル名が混在している): 見出しは
「Default2.aspx(VB)の例」だが、
2 つ目のCompile要素だけDefault.aspx.designer.vb/
Default.aspx(2なし)になっている。
Default2で統一するのが正しいと読める。<Compile Include="Default2.aspx.vb"> <SubType>ASPXCodeBehind</SubType> <DependentUpon>Default2.aspx</DependentUpon> </Compile> <Compile Include="Default2.aspx.designer.vb"> <DependentUpon>Default2.aspx</DependentUpon> </Compile>
DependentUponの効果:ソリューション エクスプローラーで Default2.aspx ├ Default2.aspx.vb ← ぶら下がって表示される └ Default2.aspx.designer.vb → 表示の問題だけでなく、【VS が「この 3 つは一組」と認識する】 = designer の再生成対象になる ★designer が再生成されない原因の多くは、ここの記述漏れである。
ファイルを手でコピーして.csprojに追加した場合に起きやすい。
Default2.aspx の @Page ディレクティブの
- CodeBehind 属性には、"Default2.aspx.vb" を設定。
- Inherits 属性には、Default2.aspx.vb のクラス名(名前空間を含む)を設定。
クラス名は任意だが、Inherits 属性と一致していること。
Default.aspx.designer.vb 中のクラス名は、
Default2.aspx.vb のクラス名に一致している必要がある。
補足(4 つの整合条件のまとめ): 本節が述べている条件を
1 枚にまとめると、トラブル時の確認表になる。【Default2.aspx】 <%@ Page CodeBehind="Default2.aspx.vb" Inherits="MyApp.Default2" %> ↓ 一致 【Default2.aspx.vb】 Namespace MyApp Partial Public Class Default2 ← ① Inherits と一致 Inherits System.Web.UI.Page End Class End Namespace ↓ 一致 【Default2.aspx.designer.vb】 Namespace MyApp Partial Public Class Default2 ← ② 同じ名前空間・同じクラス名 Protected WithEvents TextBox1 As TextBox End Class End Namespace ↑ 【.vbproj】 <Compile Include="Default2.aspx.designer.vb"> <DependentUpon>Default2.aspx</DependentUpon> ← ③ 関連付け </Compile>
Partial(partial)がキーワードである。
**コード ビハインドと designer が
「同じクラスの 2 つの断片」**として結合されるため、・名前空間が違えば別クラスになる → フィールドが見つからない ・クラス名が違えば別クラスになる → 同上 ・アクセス修飾子が食い違うとコンパイル エラーエラー メッセージ別の原因:
症状 原因 「TextBox1 は現在のコンテキストに存在しません」 designer が古い/名前空間不一致 「型 'Default2' は既に定義されています」 designer とコード ビハインドが別クラスになっていない(重複宣言) 実行時に「型を読み込めませんでした」 Inheritsの値が間違っている(名前空間込みで書く)designer が再生成されない .csprojのDependentUponがない
-
OSSコンソーシアム 開発基盤部会 第5回 セルフZoom 部会 (3):
Open棟梁の機能デモ、テーブル・メンテナンス画面自動生成編 - YouTube
https://youtu.be/e82QHAc0pHY?t=1021の 17:00 辺りから、実演している。
-
How to convert WebSite project to Web Application in VS 2012
https://social.msdn.microsoft.com/Forums/en-US/8602fd33-5b96-4103-b26a-b07386b2fec9/how-to-convert-website-project-to-web-application-in-vs-2012?forum=aspwebforms -
Visual Studio 2013 Missing Convert To Web Application - Stack Overflow
https://stackoverflow.com/questions/19561982/visual-studio-2013-missing-convert-to-web-application
- ASP.NET Web プロジェクト:Web アプリケーション プロジェクトと Web サイト プロジェクト
https://learn.microsoft.com/ja-jp/aspnet/web-forms/overview/deployment/web-deployment-in-the-enterprise/deploying-web-packages - ASP.NET Web Forms のページ クラスとコード ビハインド
https://learn.microsoft.com/ja-jp/previous-versions/aspnet/015103yb(v=vs.100)
Tags: 移行, .NET開発, ASP.NET, ASP.NET Web Forms
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。