Почему метод выбора привязки модели срабатывает дважды при сортировке и при использовании главной страницы?

#listview #webforms #master-pages #model-binding #asp.net-4.5

#listview #веб-формы #мастер-страницы #привязка модели #asp.net-4.5

Вопрос:

Я настроил очень простой ListView, используя минимальное кодирование, чтобы использовать привязку моделей .NET 4.5 для веб-форм. Я успешно использовал modelbinding на нескольких страницах сайта и довольно хорошо знаком с ним, но только недавно обнаружил, что код дважды извлекает данные при сортировке. Я переработал его до этого тестового примера и проверил, что проблема возникает только при его использовании на главной странице.

ASPX / CS:

   //webform-test.aspx
    <%@ Page Title="" Language="C#" MasterPageFile="WebformTest.Master" CodeBehind="webform-test.aspx.cs" Inherits="IPA.webform_test" AutoEventWireup="true" %>

    <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
        Test<br>
        <asp:ListView ID="lvEmployee" runat="server" ItemType="My.Entities.Employee" SelectMethod="lvEmployee_GetData">
            <ItemTemplate>
                <tr>
                    <td><asp:Button ID="btnE" runat="server" CommandName="Edit" Text="edit" /></td>
                    <td><asp:DynamicControl runat="server" DataField="id" Mode="ReadOnly" /></td>
                    <td><asp:DynamicControl runat="server" DataField="LastName" /></td>
                    <td><asp:DynamicControl runat="server" DataField="FirstName" /></td>
                </tr>
            </ItemTemplate>
            <LayoutTemplate>
                <table>
                    <tr>
                        <th></th>
                        <th><asp:LinkButton ID="lnkId" runat="server" CommandName="Sort" CommandArgument="id">Id</asp:LinkButton></th>
                        <th>Last Name</th>
                        <th>First Name</th>
                    </tr>
                    <tr id="itemPlaceholder" runat="server"></tr>
                </table>
            </LayoutTemplate>
        </asp:ListView>
    </asp:Content>

  //webform-test.aspx.cs
    using My.Entities;
    using System;
    using System.Linq;

    namespace IPA
    {
        public partial class webform_test : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                }
                else
                {
                }
            }

            public IQueryable<My.Entities.Employee> lvEmployee_GetData()
            {
                var ent = Employee.GetAll();
                return ent;
            }
        }
    }
  

МАСТЕР:

     <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="WebformTest.Master.cs" Inherits="IPA.WebformTest" ViewStateMode="Disabled" EnableViewState="false" %>

    <!DOCTYPE html>
    <html lang="en">
    <head runat="server">
        <title>TEST PAGE</title>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE-edge" />
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <asp:ContentPlaceHolder ID="head" runat="server"></asp:ContentPlaceHolder>
    </head>
    <body class="cbp-spmenu-push admin">
        <form id="form1" runat="server">
            <div>Master</div>
            <asp:ContentPlaceHolder ID="MainContent" runat="server"></asp:ContentPlaceHolder>
            <asp:ContentPlaceHolder ID="foot" runat="server"></asp:ContentPlaceHolder>
        </form>
    </body>
    </html>

    using System;

    namespace IPA
    {
        public partial class WebformTest : System.Web.UI.MasterPage
        {
            protected void Page_Load(object sender, EventArgs e)
            {
            }
        }
    }
  

Если я включаю точку останова var ent = Employee.GetAll(); и выполняю отладку, данные обрабатываются нормально, затем, когда я нажимаю «Сортировать», он снова попадает в эту точку останова, затем переходит на главную страницу и после загрузки главной страницы возвращает точку останова и снова загружает данные (переходя с помощью F11). Это последняя часть, которую я не понимаю, поскольку остальное — совершенно знакомый материал. Есть ли что-то, чего мне не хватает в цикле привязки модели?

Почему он это делает и, что более важно, как я могу повлиять на него, чтобы он извлекал данные только один раз за обратную передачу?

ДОПОЛНИТЕЛЬНАЯ / ОБНОВЛЕННАЯ ИНФОРМАЦИЯ: я заменил ListView на GridView, например:

     <asp:GridView ID="gvEmployee" runat="server" ItemType="My.Entities.Employee" DataKeyNames="id" SelectMethod="gvEmployee_GetData" AllowSorting="true">
</asp:GridView>
  

Это не приводит к повторному извлечению данных. Это одновременно и успокаивает, и расстраивает, и привлекает внимание к моей реализации ListView или самому элементу управления ListView.

Ответ №1:

Я снова столкнулся с этой проблемой в другом проекте. Проблема возникла из-за того, что я установил эту директиву на своей главной странице:

 <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="WebformTest.Master.cs"
    Inherits="IPA.WebformTest" ViewStateMode="Disabled" EnableViewState="false" %>
  

Путем удаления ViewStateMode="Disabled" , таким образом, по умолчанию включено, проблема решена. Я не уверен, почему, и я оставлю это для нового вопроса.

Он не отправлял обратно дважды. Он просто дважды нажимает на метод getData подряд, и, по-видимому, между ними ничего нет [т.Е. с помощью пошаговой отладки F11].