ASP.NET ListView с одинаковой разметкой в ​​EditItemTemplate и InsertItemTemplate - PullRequest
1 голос
/ 02 февраля 2010

У меня есть ListView, который включает EditItemTemplate и InsertItemTemplate. Две формы разделяют почти всю их разметку. Например:

<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 с ними не очень удобен). Есть ли альтернатива?

Ответы [ 2 ]

2 голосов
/ 20 мая 2015

Я очень опаздываю на вечеринку, но для любого, кто ищет декларативное решение, я в итоге сделал следующее (control - это мой FormView):

if (control.EditItemTemplate == null)
{
    control.EditItemTemplate = control.InsertItemTemplate;
}

А для шаблона:

<InsertItemTemplate>

    ... template ...

    <asp:LinkButton Text="Insert" CommandName="Insert" runat="server" 
                    Visible='<%# Container.ItemType == ListViewItemType.InsertItem %>' />
    <asp:LinkButton Text="Update" CommandName="Update" runat="server"
                    Visible='<%# Container.ItemType == ListViewItemType.DataItem %>' />
    <asp:LinkButton Text="Cancel" CommandName="Cancel" runat="server" 
                    Visible='<%# Container.ItemType == ListViewItemType.DataItem %>' />
</InsertItemTemplate>

Где интересный бит, очевидно: Container.ItemType == ListViewItemType.DataItem (и другие). Это правильно устанавливает видимость кнопок в соответствии с типом шаблона.

2 голосов
/ 04 февраля 2010

В итоге я создал собственный ListView, который делает это просто.Если там нет InsertItemTemplate, тогда EditItemTemplate используется для обоих:

    Private Sub ListView_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        If Me.InsertItemTemplate Is Nothing Then
            Me.InsertItemTemplate = Me.EditItemTemplate
        End If
    End Sub

Я также создал пользовательскую кнопку «сохранить», которая переключает свое имя команды между «Обновить» и «Вставить» в зависимости от ситуации:1004 *

    Private Sub SaveLinkButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
        Dim _ListView As Controls.ListView = GetListView()
        If _ListView IsNot Nothing Then
            If Me.BindingContainer Is _ListView.EditItem Then
                Me.CommandName = "Update"
            Else
                Me.CommandName = "Insert"
            End If
        End If
    End Sub

(Приведенная выше функция GetListView просто перемещает родителей по кнопке до тех пор, пока не найдет ListView.)

Вот и все - надеюсь, что это кому-нибудь пригодится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...