我有一个包含 EditItemTemplate 和 InsertItemTemplate 的 ListView。这两种形式几乎共享它们的所有标记。例如:
<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>
当然,实际上在插入和编辑模板中发生了很多事情(很多字段,包括格式化、验证等),我讨厌必须维护相同的标记两次。
我的第一个想法是将所有共享标记移动到用户控件(.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 对它们不太满意)。有替代方案吗?