2016-09-30 15 views
0

我已經使用最少編碼設置了一個非常簡單的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控件本身上。

回答

0

我在另一個項目中再次遇到此問題。出現這個問題,因爲我已經在我的母版設置這個指令:

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

通過消除ViewStateMode="Disabled",因此默認爲已啓用,這個問題解決了。我不確定爲什麼,我會留下一個新的問題。

它沒有發回兩次。它只需連續兩次打開GetData方法,兩者之間顯然沒有任何內容[即用F11步調試]。

相關問題