我已經使用最少編碼設置了一個非常簡單的ListView,以利用.NET Framework 4.5 for WebForms綁定。我在幾個網站頁面上成功地使用了modelbinding,並且對它非常熟悉,但直到最近才發現代碼在排序時提取兩次數據。我已經完成了這個測試用例,並驗證了只有在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,在Master的PageLoad之後,再次返回斷點並再次加載數據(通過F11逐步完成)。這是我不明白的最後一部分,因爲其餘部分完全是熟悉的東西。 ModelBinding循環有什麼缺失?
它爲什麼這樣做,更重要的是我該如何影響它,所以它只能每回發一次提取數據?
附加/更新的信息: 我換成ListView控件與像一個GridView:
<asp:GridView ID="gvEmployee" runat="server" ItemType="My.Entities.Employee" DataKeyNames="id" SelectMethod="gvEmployee_GetData" AllowSorting="true">
</asp:GridView>
這並沒有打我的數據檢索兩次。這既讓人沮喪又令人沮喪,並將焦點放在我的ListView實現或ListView控件本身上。