EditItemTemplate と InsertItemTemplate を含む ListView があります。2 つのフォームは、ほとんどすべてのマークアップを共有しています。例えば:
<asp:listview runat="server" ... >
<layouttemplate>...</layouttemplate>
<itemtemplate>
<p><%#Eval("Name")%></p>
<p><%#Eval("Title")%></p>
...
</itemtemplate>
<insertitemtemplate>
<p>Name: <asp:textbox runat=server text='<%#Bind("Name")%>' /></p>
<p>Title: <asp:textbox runat=server text='<%#Bind("Title")%>' /></p>
...
<asp:button runat=server commandname="Insert" text="Save" />
</insertitemtemplate>
<edititemtemplate>
<p>Name: <asp:textbox runat=server text='<%#Bind("Name")%>' /></p>
<p>Title: <asp:textbox runat=server text='<%#Bind("Title")%>' /></p>
...
<asp:button runat=server commandname="Update" text="Save" />
</edititemtemplate>
</asp:listview>
もちろん、実際には、挿入テンプレートと編集テンプレートで多くのことが行われています (多くのフィールド、書式設定、検証など)。同じマークアップを 2 回維持する必要はありません。
私が最初に考えたのは、すべての共有マークアップをユーザー コントロール (.ascx) に移動することでした。
<insertitemtemplate>
<custom:myform runat=server />
<asp:button runat=server commandname="Insert" text="Save" />
</insertitemtemplate>
<edititemtemplate>
<custom:myform runat=server />
<asp:button runat=server commandname="Update" text="Save" />
</edititemtemplate>
残念ながら、フォームがユーザー コントロール内にある場合、双方向バインディング (text='<%#Bind("Foo")%>') は一方向にしか機能しません (データをコントロールからデータベース)。
別の方法は、すべての共有マークアップをインクルード ファイルに移動することです。サーバー側のインクルードは従来の ASP への逆戻りですが、インクルード ファイルのコンテンツはページ上にあるマークアップのように扱われるため、ASP.NET でも機能し、このような状況で役立ちます。
しかし、インクルード ファイルはまだ少しばかげており、欠点もあります (たとえば、VisualStudio ではあまり快適ではありません)。代替手段はありますか?