#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].