Skip to content

MS_ASPXDesignerGeneration

nishi_74322014 edited this page Aug 21, 2026 · 1 revision

*.aspx.designer.cs(vb)を生成する方法

概要

補足(原文の疑問への回答:メニューは今もある): 「使えなくなって
ませんかね?」という問いに答えておくと、
「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サイト → アプリ移行時の手順

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 の属性 CodeFile CodeBehind
プロジェクト ファイル なし .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.aspx2 なし)になっている

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 に追加した場合に起きやすい。

*.aspxファイル

Default2.aspx の @Page ディレクティブの

  • CodeBehind 属性には、"Default2.aspx.vb" を設定。
  • Inherits 属性には、Default2.aspx.vb のクラス名(名前空間を含む)を設定。

*.aspx.vbファイル

クラス名は任意だが、Inherits 属性と一致していること。

*.aspx.designer.vbファイル

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>

Partialpartial)がキーワードである。
**コード ビハインドと designer が
「同じクラスの 2 つの断片」**として結合されるため、

・名前空間が違えば別クラスになる → フィールドが見つからない
・クラス名が違えば別クラスになる → 同上
・アクセス修飾子が食い違うとコンパイル エラー

エラー メッセージ別の原因:

症状 原因
「TextBox1 は現在のコンテキストに存在しません」 designer が古い/名前空間不一致
「型 'Default2' は既に定義されています」 designer とコード ビハインドが別クラスになっていない(重複宣言)
実行時に「型を読み込めませんでした」 Inherits の値が間違っている(名前空間込みで書く)
designer が再生成されない .csprojDependentUpon がない

参考

Microsoft Learn


Tags: 移行, .NET開発, ASP.NET, ASP.NET Web Forms

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally