2011-07-12 41 views
0

我試圖在ASP.net中創建一個分頁器,並且正在運行時發生錯誤。ASP.net - 名稱'pageNumber'在當前上下文中不存在

試圖做到這一點在我的標記:

<div class="pager"> 
<% foreach(int pageNumber in this.PageCollection) { %> 
    <% if(pageNumber == this.PageIndex) { %> 
     <span class="current"><%= pageNumber %></span> 
    <% } else { %> 
     <asp:LinkButton ID="lnkGoToPage" runat="server" OnClick="lnkGoToPage_Click"><%= pageNumber %></asp:LinkButton> 
    <% } %> 
<% } %> 

我收到以下錯誤:

Compiler Error Message: CS0103: The name 'pageNumber' does not exist in the current context 

該錯誤是發生在LinkBut​​ton的線。它可以在第一個情況下正常工作......但由於某種原因,我的變量在else情況下不存在。

有沒有人有任何想法,爲什麼這不是編譯或我可以做不同的相同的事情。

自從我完成了常規的ASP.net,我已經習慣了MVC方式。

+0

你可以消除很多嵌入式服務器標記 – slandau

+0

的可能要解釋的是如何,而不是隻說是可以做到的。我問了一個更好的方式來做到這一點:) – Dismissile

+0

我剛剛評論了標記,沒有回答問題,因此評論而不是答案! – slandau

回答

1

您不能將<%= pageNumber %>放置在LinkBut​​ton中。

或者,使用Repeater控件和OnItemDataBound事件在後面的代碼中添加邏輯,例如pageNumber == this.PageIndex

<asp:Repeater ID="Pager" runat="server"> 
    <ItemTemplate> 
     <asp:Literal ID="ltlGoToPage" runat="server" Visible="false"></asp:Literal> 
     <asp:LinkButton ID="lnkGoToPage" runat="server" OnClick="lnkGoToPage_Click" Visible="false"></asp:LinkButton> 
    </ItemTemplate> 
</asp:Repeater> 

您可以在OnItemDataBound事件中切換控件的可見性。

在後面的代碼,引用控制和應用任何邏輯:

var ltlGoToPage = (Literal)e.Item.FindControl("ltlGoToPage"); 
var lnkGoToPage = (Literal)e.Item.FindControl("lnkGoToPage"); 
+0

使用中繼器,它工作得很好。不像我習慣於使用MVC那樣乾淨/簡單,但仍然有效。 – Dismissile

+0

你釘了它,在MVC中更高效的內聯代碼,web表單是... web表單。 – maxbeaudoin

0

這不是你如何在asp.net web窗體中做的事情,你應該在後面的代碼中做循環。

錯誤是由於問題<%= pageNumber %>位於控件中間而引起的。

+0

你究竟會在代碼後面循環?我需要動態創建標記。我更多的是一個MVC傢伙...... – Dismissile

+1

你不會動態地創建標記。您可以動態地將控件添加到代碼中的頁面。通常情況下,您將在希望控件去的標記中放置面板或佔位符控件,然後在後面的代碼中將控件添加到面板的控件集合中。 –

1
<div class="pager"> 
<% foreach(int pageNumber in this.PageCollection) { 
    if(pageNumber == this.PageIndex) { %> 
     <span class="current"><%= pageNumber.ToString() %></span> 
    <% } else { %> 
     <asp:LinkButton ID="lnkGoToPage" runat="server" OnClick="lnkGoToPage_Click"><%= pageNumber.ToString() %></asp:LinkButton> 
    <% } 
} %> 

這將有助於消除一些標記。此外,在頁碼上調用ToString(),這對我來說只是常見的做法,但您可能不希望如此。

0

對不起,我之前的帖子。我想說我看到它的方式是使用控件的Text屬性。 這應該工作:

<div class="pager"> 
<% foreach(int pageNumber in this.PageCollection) { %> 
    <% if(pageNumber == this.PageIndex) { %> 
     <span class="current"><%= pageNumber %></span> 
    <% } else { %> 
     <asp:LinkButton ID="lnkGoToPage" runat="server" OnClick="lnkGoToPage_Click"></asp:LinkButton> 
    <% 
lnkGoToPage.Text = pageNumber.ToString(); 
} %> 
<% } %> 

此外,你應該考慮給sdifferent的ID給了LinkBut​​ton,以確保它們是不同的。但是,在概念上,上面的代碼應該可以工作

+0

你的代碼會拋出一個異常:服務器標籤不能包含<% ... %>構造... – maxbeaudoin

相關問題