2016-09-30 32 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步调试]。

相关问题