WebFormsの.NET 4.5モデルバインディングを活用するために、最小限のコーディングを使用して非常に単純なListViewをセットアップしました。私はいくつかのサイトページでモデルバインディングを成功させ、かなり慣れ親しんでいましたが、ソート時にコードがデータを2回取り出すことが最近発見されました。私はこのテストケースにそれを蒸留し、MasterPage内で使用するときにのみ問題が発生することを確認しました。モデルバインディング選択メソッドは、ソートやマスターページの使用中に2回起動するのはなぜですか?
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 Page Loadを実行した後、ブレークポイントを右に戻して、再度データをロードします(F11でステップ実行)。それは私が理解していない最後の部分です。残りは完全に身近なものです。 ModelBindingサイクルに欠けているものがありますか?
なぜこれが重要なのですが、どのように影響してポストバックごとにデータが1回だけ取り出されるのでしょうか?これは、は二回私のデータ検索にヒットしません
<asp:GridView ID="gvEmployee" runat="server" ItemType="My.Entities.Employee" DataKeyNames="id" SelectMethod="gvEmployee_GetData" AllowSorting="true">
</asp:GridView>
:私は次のようにGridViewコントロールとListViewコントロールを置き換え :
追加/情報を更新しました。これは、リリーブとイライラの両方であり、ListViewの実装またはListViewコントロール自体に注目しています。