少し問題が解決したので自分メモ用。初投稿になります!
やりたいこと
Repeaterコントロールを使用して繰り返し表示をしたい
前提条件
- ASP.NET + WebForm
- RepeaterコントロールにはArrayListを指定
- ArrayListにはモデルクラス(Hoge)を格納
- モデルクラス等は別プロジェクト(hogehoge)で構成されており、本体のプロジェクトはそちらを参照する
namespace hogehoge.models
public sealed class Hoge()
{
public string No
{
get;
set;
}
public string Name
{
get;
set;
}
}
やったこと
- aspxファイル内で名前空間を指定する
<%@ Import Namespace="hogehoge.models" %>
- Hogeクラスにキャストする
<asp:Repeater ID="repeater" runat="server">
<ItemTemplate>
<tbody>
<tr>
<td><%# ((Hoge)(Container.DataItem)).No %></td>
<td><%# ((Hoge)(Container.DataItem)).Name %></td>
</tr>
</tbody>
</ItemTemplate>
</asp:Repeater>
このままだと参照指定不足で警告が出るので、Web.Configに名前空間を指定する。
<system.web>
<pages>
<namespaces>
<add namespace="hogehoge.models"/>
</namespaces>
</pages>
</system.web>
はまった点
Google先生に教えを乞いたが、キーワードが悪いのかヒットせず苦労した。
Web.Configで指定する方法を知らなかったので、参照不足問題に悩まされた。
モデルクラスを本体側のApp_Codeフォルダに入れて試したが、CS0433エラー、ビルドアクション、コンパイルエラーに悩まされた。
昔はGridViewを使用していたので特別困ることはなかったが、今回はモックから作成したのでこのままHTML構成を変更せずに進めようとRepeaterコントロールを使用したのでした。
おまけ
- Dictionaryの使用方法
<asp:Repeater ID="repeater" runat="server">
<ItemTemplate>
<tbody>
<tr>
<td><%# ((Hoge)DataBinder.Eval(Container.DataItem, "value")).No %></td>
<td><%# ((Hoge)DataBinder.Eval(Container.DataItem, "value")).Name %></td>
</tr>
</tbody>
</ItemTemplate>
</asp:Repeater>
課題
毎回Container.DataItemを指定せず、Hogeクラスにキャストできる気がするが、<% と <%# をうまく区別できない・・。
- イメージ
<asp:Repeater ID="repeater" runat="server">
<ItemTemplate>
<%= Hoge hoge = (Hoge)Container.DataItem %>
<tbody>
<tr>
<td><%# hoge.No %></td>
<td><%# hoge.Name %></td>
</tr>
</tbody>
</ItemTemplate>
</asp:Repeater>
追記
テンプレート(と呼んでよいのか)側にコードの記述が増えるので(既に増えている・・)好ましくはないが、aspxファイルのソース側のcsファイルにprotected宣言した変数は参照できる様子・・。まじか。。
public partial class HogePage: Page
{
protected ArrayList hoges;
・・・
Hoge hoge = new Hoge();
hoge.No = "100";
hoge.Name = "ほげ";
hoges.Add(hoge);
}
<% foreach (Hoge hoge in hoges) { %>
<tbody>
<tr>
<td><%# hoge.No %></td>
<td><%# hoge.Name %></td>
</tr>
</tbody>
<% } %}
ん~、WebFormに限って言えば、コントロール使うよりこっちの方がすっきりする気がする。どうするかな・・。