2016-09-30 22 views
0

Я установил очень простой ListView, используя минимальное кодирование, чтобы использовать привязку модели .NET 4.5 для WebForms. Я успешно использовал модельную привязку на нескольких страницах сайта и довольно хорошо знаком с ней, но только недавно обнаружил, что код извлекает данные дважды при сортировке. Я переделал его на этот тестовый пример и подтвердил, что проблема возникает только при использовании его в 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 и после MasterLoadLoad, верните точку останова и снова загрузите данные (перейдя через F11). Это последняя часть, которую я не понимаю, так как все остальное полностью знакомо. Есть ли что-то, что мне не хватает в цикле ModelBinding?

Почему это делает это и, что более важно, как я могу повлиять на него, так что он извлекает данные только один раз после обратной передачи?

ДОПОЛНИТЕЛЬНЫЙ/ОБНОВЛЕНО INFO: Я заменил ListView с GridView, как:

<asp:GridView ID="gvEmployee" runat="server" ItemType="My.Entities.Employee" DataKeyNames="id" SelectMethod="gvEmployee_GetData" AllowSorting="true"> 
</asp:GridView> 

Это не ударилась поиска данных в два раза. Это как облегчение, так и разочарование, и ставит внимание на мою реализацию ListView или сам элемент управления ListView.

ответ

0

Я снова попал в эту проблему в другом проекте. Проблема возникла, потому что я установить эту директиву в моем Masterpage:

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

Удаляя ViewStateMode="Disabled", таким образом, недобросовестный Enabled, проблема решена. Я не знаю, почему, и я оставлю это для нового вопроса.

Это не сообщение дважды. Он просто дважды ударяет по методу GetData, по-видимому, ничего между ними (т.е. с пошаговой отладкой F11].