Я установил очень простой ListView, используя минимальное кодирование, чтобы использовать привязку модели .NET 4.5 для WebForms. Я успешно использовал модельную привязку на нескольких страницах сайта и довольно хорошо знаком с ней, но только недавно обнаружил, что код извлекает данные дважды при сортировке. Я переделал его на этот тестовый пример и подтвердил, что проблема возникает только при использовании его в MasterPage.Почему метод выбора привязки модели срабатывает дважды при сортировке и использовании главной страницы?
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:
<%@ 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();
и отладки, она захватывает штраф данных, а затем, когда я нажимаю сортировать, она попадает, что точки останова снова, затем переходите к MasterPage и после MasterLoadLoad, верните точку останова и снова загрузите данные (перейдя через F11). Это последняя часть, которую я не понимаю, так как все остальное полностью знакомо. Есть ли что-то, что мне не хватает в цикле ModelBinding?
Почему это делает это и, что более важно, как я могу повлиять на него, так что он извлекает данные только один раз после обратной передачи?
ДОПОЛНИТЕЛЬНЫЙ/ОБНОВЛЕНО INFO: Я заменил ListView с GridView, как:
<asp:GridView ID="gvEmployee" runat="server" ItemType="My.Entities.Employee" DataKeyNames="id" SelectMethod="gvEmployee_GetData" AllowSorting="true">
</asp:GridView>
Это не ударилась поиска данных в два раза. Это как облегчение, так и разочарование, и ставит внимание на мою реализацию ListView или сам элемент управления ListView.