2016-09-30 4 views
0

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コントロール自体に注目しています。

答えて

0

別のプロジェクトでこの問題が再び発生しました。私は私のマスターページにこのディレクティブを設定していたため、問題が発生しました:

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

ので、有効に不履行、ViewStateMode="Disabled"を除去することにより、問題は解決しました。なぜ私は新しい質問のためにそれを残すのか分からない。

2回転記されませんでした。 GetDataメソッドを2回連続して実行するだけです。 F11ステップ・デバッグ]

関連する問題