QA@IT

asp.net/Repeater内のuniqueidについて

3953 PV

vs2010(F/W3.5)のasp.netでフォームを作成しています。

Repeaterコントロール内のコントロールのUniqueIdがユニークにならず困っております。
想定では

<asp:Repeater runat="server" ID="hoge">
<ItemTemplate>
    <asp:TextBox runat="server" ID="text_a" />
</ItemTemplate>
</asp:Repeater>

とした場合、
hoge$text_a1
hoge$text_a2
hoge$text_a3
のようにユニークなIDが振られることを想定していました。
ところがすべてのコントロールが
ID="text_a"
となっています。

何が原因でしょうか?

  • VS2010ならFrameworkは4.0になりそうですが、あえて3.5指定しているという意味でしょうか? -

回答

ご回答ありがとうございます。
VSのバージョンを確認しましたが、やはり2010で間違いございません。

以下VSのバージョン情報より
Microsoft Visual Studio 2010
Version 10.0.40219.1 SP1Rel
Microsoft .NET Framework
Version 4.5.50709 SP1Rel

このVSで「新しいプロジェクト」を作成するときに
「Framework3.5」を選択しています。

なぜ3.5にしているかと言うと
レンタルサーバーが3.5までしか対応していないからです。

ただ、今回の現象が発生しているのは
レンタルサーバーではなく
ASP.NET開発サーバーです。

あとブラウザはIE10を使用しています。

ソースが悪いというよりは環境が悪い
という方向で調査した方がよろしいでしょうか?

編集 履歴 (0)
  • 開発環境のOSはなんですか? -
  • Windows 7 Pro SP1
    になります。
    -
  • 回答に追記しました。 -

VS2008では再現しませんでした(期待通り、通番降られたIDになりました)が、色々疑問もあります。

まず、提示していただいたコードはVS2008のものですね、VS2010ではマスターページが生成されるようなのでこのようなコードにはなりませんでした(なので実行もVS2008でやっています)。
コメントにも書きましたが、VS2010は.NET 4.0になります。

この辺りも含め正確な環境情報を書いて下さい。また、VS2008で作成してVS2010で編集している場合も同様です。ブラウザのバージョンも教えてください。


出力されるHTMLですが、metaタグの量が私の環境より多いですね。
なにか関係があるかもしれません。

ASP.NETは昔、IEのバージョン判定にバグがあってIE10がIE1と判断されていました。
パッチ当てていなければ今も現役でそういうサーバーは存在します。
このあたりも怪しいのでIEのバージョンもお知らせ下さい。

余談ですが現時点のIE11はUAにIEという文字がないためその影響を受けません。


08/23 追記

Win7 + VS2010の組み合わせで 2つ環境でやってみましたがやはり起きません。
ちょっと原因もわかりませんね。
気になるのはやはりmetaタグがなぜ出ているかですね。
開発環境が過去に他の人が使っていたなどの場合は preinitイベントでなにか処理する様プロジェクトテンプレートが変更されている可能性もあるかも?

確認してみた方がいいのは(回答は特にしなくて結構です)

  • 新規に作成しても必ずおこるのか
  • .NET4 だと期待通り動くのか
  • Pageディレクティブが省略されているが、変わった指定をしていないか
  • IE以外でも発生するか
  • IEの互換モードを切り替えても起こるか
  • レンタルサーバーでも起きるのか
  • 他のマシン(できるだけクリーンな状態のもの)でも起きるか
  • 提示してくれたソースそのままか(@Pageディレクティブは不足しているが貼り付け忘れただけと解釈しています)

あたりでしょうか。

.NET4からIDを固定にする ClientIDModeというのがありますがこれも.NET3.5で実行するとエラーになるので違うはずですし(それにnameは書き換わる)、
RepeaterのItemCreatedイベントだとIDが元のままですがそういう話でもないですしね。

なお、前述のIE10検出バグのパッチはあてていません。

http://support.microsoft.com/kb/2600100/ja

http://www.hanselman.com/blog/BugAndFixASPNETFailsToDetectIE10CausingDoPostBackIsUndefinedJavaScriptErrorOrMaintainFF5ScrollbarPosition.aspx

編集 履歴 (2)

現象が出ているソースです。
Default.aspx

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:Repeater runat="server" ID="aaa">
        <ItemTemplate>
            <asp:TextBox runat="server" ID="bbb" />
        </ItemTemplate>
    </asp:Repeater>
    </form>
</body>
</html>

Default.aspx.vb

Public Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If IsPostBack Then
            Return
        End If

        Dim table As New DataTable
        table.Columns.Add(New DataColumn("ccc"))

        For i = 1 To 10
            Dim r As DataRow = table.NewRow
            r("ccc") = i.ToString
            table.Rows.Add(r)
        Next

        Me.aaa.DataSource = table
        Me.aaa.DataBind()
    End Sub

End Class

実行結果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><meta http-equiv="content-language" content="ja" /><meta http-equiv="content-style-type" content="text/css" /><meta http-equiv="content-script-type" content="text/javascript" /><meta http-equiv="pragma" content="no-cache" /><meta http-equiv="cache-control" content="no-cache" /><meta http-equiv="expires" content="0" /><title>

</title></head>
<body>
    <form name="form1" method="post" action="Default.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMTAzMDE5NjQzD2QWAgIDD2QWAgIBDxYCHgtfIUl0ZW1Db3VudAIKZGT2cAOzJfxpNL5A5ZukofehnvKlWA==" />
</div>

<div>
    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWCwLHtPKaCALdisw7ArqKzDsCm4zMOwKAjMw7AtmJzDsCtonMOwKXi8w7AvyKzDsClYnMOwLyiMw7BarzwEHb/hvG9W+neVi/ii77N7M=" />
</div>

            <input name="bbb" type="text" id="bbb" />
            <input name="bbb" type="text" id="bbb" />
            <input name="bbb" type="text" id="bbb" />
            <input name="bbb" type="text" id="bbb" />
            <input name="bbb" type="text" id="bbb" />
            <input name="bbb" type="text" id="bbb" />
            <input name="bbb" type="text" id="bbb" />
            <input name="bbb" type="text" id="bbb" />
            <input name="bbb" type="text" id="bbb" />
            <input name="bbb" type="text" id="bbb" />
    </form>

</body>
</html>

希望している結果は

<input name="aaa$ctl00$bbb" type="text" id="aaa_ctl00_bbb" />

なのですが…

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。