ASP.NET で使用する .inc ファイルの C# コードにブレークポイントを設定するにはどうすればいいかを書きます。(そもそも .inc ファイルに C# のコードを書く必要があるのかという話はちょっと置いときます)
元の話は terateil のスレッド ASP.NETのデバッグについてです。
C# のコードを .inc ファイルに含めて、コードビハインドの .aspx.cs ファイルの C# のコードと同様に ASP.NET にコンパイルさせることができます。
ただし、少なくとも自分の環境では、デフォルトではブレークポイントを設定できませんでした。クリックして特定の行にブレークポイントを設定しようとすると <script runat="server"> の行に設定されるように見えますが、デバッグ実行で止まりません。
どうすればよいかと言うと、Visual Studio の設定で[ツール(T)]⇒[オプション(O)...]⇒[テキストエディタ]のファイル拡張子に inc を追加してやります。
Visual Studio のヘルプによると、この設定で "特定の拡張子を持つすべてのファイルを Visual Studio 統合開発環境 (IDE) で扱うように指定できます" とのことです。文字のハイライトやインテリセンスが働くようになるだけでなく、ブレークポイントの設定も可能になります。(自分の環境では、.inc ファイルをいったん閉じて再度開く必要がありましたが)
知ってました? 実は、自分は teratail のスレッドで聞くまで知らなかったです。もっと正直に言うと、C# のコードを .inc ファイルに含めても、リテラル扱いとなって、生の C# のコードがそのまま html ソースに出力されると思ってました。(汗)
以下に、検証に使ったコードと、若干のコメント・注意点を書いておきます。
.inc ファイル
この例では JavaScript のコードと C# のコードの両方を含めました。JavaScript のコードは、インラインで .aspx ファイルに書き込んだのと同様にリテラルとして取り込まれ、そのまま html ソースに書き出される。一方、C# のコードはコードビハインド扱いとなり、.aspx.cs ファイル の C# のコードと同様にコンパイルされます。
System.Diagnostics.Debugger.Break(); はブレークポイントが設定できないと思ったので代わりに置いたものです。不要となったのでコメントアウトしました。
<script type="text/javascript">
var msg = "message";
// alert(msg);
</script>
<script runat="server">
protected void Selection_Change(Object sender, EventArgs e)
{
//System.Diagnostics.Debugger.Break();
DropDownList ddl = (DropDownList)sender;
Label1.Text = ddl.SelectedValue;
int i;
for (i = 0; i < 10; i++)
{
//System.Diagnostics.Debugger.Break();
}
Label1.Text += ", i = " + i.ToString();
}
</script>
.aspx.cs ファイル
コードビハインドとして Visual Studio が自動生成した C# のコードです。自動生成されたコードのそのままで手は加えていません。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _0023_includeFile : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
.aspx ファイル
<!-- #include file ="analytics.inc" --> で上の .inc ファイルを取り込みます。本体には DropDownList と Label を配置。DropDownList の SelectedIndexChanged イベントのハンドラは .inc ファイルの C# のコードに定義しました。
ASP.NET がこのコードをコンパイルする際、.inc ファイルの JavaScript のコードはそのままリテラルとして取り込まれます(結果、html ソースにはその位置にそのまま JavaScript のコードが書き出されます)。.inc ファイルと .aspx.cs ファイルの C# のコードはコンパイルされます。
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="0023-includeFile.aspx.cs"
Inherits="_0023_includeFile" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<!-- #include file ="analytics.inc" -->
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList id="ColorList"
AutoPostBack="True"
OnSelectedIndexChanged="Selection_Change"
runat="server">
<asp:ListItem Selected="True" Value="White">
White
</asp:ListItem>
<asp:ListItem Value="Silver">
Silver
</asp:ListItem>
<asp:ListItem Value="DarkGray">
Dark Gray
</asp:ListItem>
<asp:ListItem Value="Khaki">
Khaki
</asp:ListItem>
<asp:ListItem Value="DarkKhaki">
Dark Khaki
</asp:ListItem>
</asp:DropDownList>
<br />
<asp:Label ID="Label1" runat="server" />
</div>
</form>
</body>
</html>