2013-03-20 64 views
1

我在使用AJAX的Umbracos Razor viewengine中遇到了一些问题。Umbraco Razor分页

事情是,该寻呼需要是这样的:

1 | 2 | 3 | 4 ... 16 Next >> 

当用户点击任何东西比4更大的需要是这样的:

<< Previous 1 ... 6 | 7 | 8 | 9 | 10 ... 16 Next >> 

,使其显示前两页和下一页。

现在,当用户点击一路到最后4页,分页需要是这样的:

<< Previous 1 ... 13 | 14 | 15 | 16 

我有工作,但代码是...不漂亮,至少可以说。这是笨拙的,我有一种感觉,它可以做得比它更简单 - 只是不知道具体如何:-)

代码(确保你有一个很好,温暖的一杯咖啡; - ))

 @* Paging *@ 
     var resultCount = result.Count(); 

     if(resultCount > take) 
     { 
      <div class="paging"> 
      @{ 
       int previous = pageNumber - 1; 

       if(previous >= 0) 
       { 
        <a class="previous" id="prev" href="#" onclick="ajaxFilterSearch('@themeIds', '@video', '@brochure', @previous, '@action', '@ingredientIds', '@ingredientId');"><img src="/img/buttons/pink-hand-left.png" />@umbraco.library.GetDictionaryItem("Previous")</a> 
       } 

       double numOfPagingLinks = Convert.ToDouble(resultCount)/take; 
       int roundedNumOfPagingLinks = Convert.ToInt32(Math.Floor(numOfPagingLinks)); 
       int lastPage = roundedNumOfPagingLinks + 1; 

       if(lastPage > 4) 
       { 
        // Always show first page number 
       <a href="#" onclick="ajaxFilterSearch('@themeIds', '@video', '@brochure', '0', '@action', '@ingredientIds', '@ingredientId');">1</a> 

        if(pageNumber + 1 == lastPage) 
       { 
        <span> ... </span> 
        for(int i = lastPage - 4; i < lastPage - 1; i++) 
        { 
         int pagingNumber = i; 
         int numberToDisplay = i + 1; 

         string className = i == pageNumber ? "active" : "inactive";            
         <a href="#" class="@className" onclick="ajaxFilterSearch('@themeIds', '@video', '@brochure', @pagingNumber, '@action', '@ingredientIds', '@ingredientId');">@numberToDisplay</a> 
         <span> | </span> 
        } 
       } 
       else 
       { 
        if(pageNumber < 3) 
        { 
         for(int i = 1; i < 5; i++) 
         { 
         int pagingNumber = i; 
         int numberToDisplay = i + 1; 

         string className = i == pageNumber ? "active" : "inactive"; 

         if(i == 1) 
         { 
          <span> | </span> 
         }      
         <a href="#" class="@className" onclick="ajaxFilterSearch('@themeIds', '@video', '@brochure', @pagingNumber, '@action', '@ingredientIds', '@ingredientId');">@numberToDisplay</a> 
         if(i < 4) 
         { 
          <span> | </span> 
         } 
         else 
         { 
          <span> ... </span> 
         } 
         } 
        } 
        else 
        { 
         if(pageNumber == 3) 
         { 
         for(int i = 1; i < 6; i++) 
         { 
          int pagingNumber = i; 
          int numberToDisplay = i + 1; 

          string className = i == pageNumber ? "active" : "inactive"; 

          <a href="#" class="@className" onclick="ajaxFilterSearch('@themeIds', '@video', '@brochure', @pagingNumber, '@action', '@ingredientIds', '@ingredientId');">@numberToDisplay</a> 
          if(i < 5) 
          { 
           <span> | </span> 
          } 
          else 
          { 
           <span> ... </span> 
          } 
         } 
         } 
         else if(pageNumber > 3) 
         { 
         <span> ... </span>      
         if(pageNumber >= lastPage - 4) 
         { 
          for(int i = pageNumber - 2; i < lastPage - 1; i++) 
          { 
           int pagingNumber = i; 
           int numberToDisplay = i + 1; 

           string className = i == pageNumber ? "active" : "inactive"; 

           <a href="#" class="@className" onclick="ajaxFilterSearch('@themeIds', '@video', '@brochure', @pagingNumber, '@action', '@ingredientIds', '@ingredientId');">@numberToDisplay</a> 
           <span> | </span>        
          } 
         }       
         else 
         {       
          var firstPrevious = pageNumber - 1; 
          var secondPrevious = pageNumber - 2; 
          var firstPreviousToDisplay = firstPrevious + 1; 
          var secondPreviousToDisplay = secondPrevious + 1; 

          <a href="#" onclick="ajaxFilterSearch('@themeIds', '@video', '@brochure', @secondPrevious, '@action', '@ingredientIds', '@ingredientId');">@secondPreviousToDisplay</a>       
          <span> | </span> 

          <a href="#" onclick="ajaxFilterSearch('@themeIds', '@video', '@brochure', @firstPrevious , '@action', '@ingredientIds', '@ingredientId');">@firstPreviousToDisplay </a>       
          <span> | </span> 

          for(int i = pageNumber; i < pageNumber + 3; i++) 
          { 
           int pagingNumber = i; 
           int numberToDisplay = i + 1; 

           string className = i == pageNumber ? "active" : "inactive"; 

           <a href="#" class="@className" onclick="ajaxFilterSearch('@themeIds', '@video', '@brochure', @pagingNumber, '@action', '@ingredientIds', '@ingredientId');">@numberToDisplay</a> 
           if(i < pageNumber + 2) 
           { 
           <span> | </span> 
           } 
          } 

          <span> ... </span> 
         } 
         }        
        } 
       } 
        // Always show last pagenumber      
        <a href="#" onclick="ajaxFilterSearch('@themeIds', '@video', '@brochure', @roundedNumOfPagingLinks, '@action', '@ingredientIds', '@ingredientId');">@lastPage</a> 
       } 
       else 
       { 
        for (int i = 0; i < roundedNumOfPagingLinks + 1; i++) 
       { 
        int pagingNumber = i; 
        int numberToDisplay = i + 1; 

        string className = i == pageNumber ? "active" : "inactive"; 

        <a href="#" class="@className" onclick="ajaxFilterSearch('@themeIds', '@video', '@brochure', @pagingNumber, '@action', '@ingredientIds', '@ingredientId');">@numberToDisplay</a><span> | </span> 
       } 
       } 

       int next = pageNumber + 1; 
       if (next <= roundedNumOfPagingLinks) 
       { 
        <a class="next" id="next" href="#" onclick="ajaxFilterSearch('@themeIds', '@video', '@brochure', @next, '@action', '@ingredientIds', '@ingredientId');">@umbraco.library.GetDictionaryItem("Next")<img src="/img/buttons/pink-hand-right.png" /></a>   
       } 

      } 
      </div> 
     }        

result变量是在过滤器/搜索找到的集合。变量pageNumber是用户点击的页码。

我知道上面的代码是复杂的,不漂亮,但任何帮助/提示非常感谢!

在此先感谢。

回答

0

这种方法怎么样:你可以考虑你的分页有三种可能的状态和7个组件。状态#1是我要拨打left(或left_extended,如果总共超过4页),那就是当用户仍然在前4页时。状态#2是middle,这是用户正在导航时尚未到达最后4页。状态#3是我打电话给right,这意味着用户已经到达最后4页。

七个部件布置是这样的:

<< Previous1...6 | 7 | 8 | 9 | 10...16Next >>

中间6 | 7 | 8 | 9 | 10组件就是我所说middle block。鉴于三个地州和7个组件下面的代码可能会为所有国家已经足够了:

// Middle block limits 
var middleBlockStart = 0; 
var middleBlockFinish = 0; 
var middleBlockCount = 4; 

int resultCount = result.Count(); 
int pageNumber = // Get information from query string 
int numberOfPages = // Get the total number of pages 

// There are three possible paging states: left, middle and right 
// First we determine what state the paging is at and 
// set the middle block limits 
var pagingState = string.Empty; 

if (pageNumber >= 4) { 
    if (numberOfPages > middleBlockCount) 
     pagingState = "left_extended"; 
    else 
     pagingState = "left"; 

    middleBlockStart = 1; 
} 
else if (pageNumber >= resultCount - middleBlockCount + 1) { 
    pagingState = "right"; 
    middleBlockStart = resultCount - middleBlockCount + 1; 
} 
else { 
    pagingState = "middle"; 
    middleBlockStart = pageNumber - 2; 
    middleBlockCount = 5; 
} 

middleBlockFinish = middleBlockStart + middleBlockCount; 

// Now we print each one of the seven components 
// based on the state of the paging 

@if (pagingState == "middle" || pagingState == "right") { 
    <a class="previous" id="prev" href="#" onclick="ajaxFilterSearch(...);"> 
     <img src="/img/buttons/pink-hand-left.png" />@umbraco.library.GetDictionaryItem("Previous") 
    </a> 
    <a href="#" onclick="ajaxFilterSearch(...);">1</a> 
    <span> ... </span> 
} 

@for (int i = middleBlockStart; i < middleBlockFinish; i++) { 
    <a href="#" class="@className" onclick="ajaxFilterSearch(...);">@i</a> 

    if (i != middleBlockFinish - 1) 
     <span> | </span> 
} 

@if (pagingState == "left_extended" || pagingState == "middle") { 
    <span> ... </span> 
    <a href="#" onclick="ajaxFilterSearch(...);">@lastPage</a> 
} 

@if (pagingState.StartsWith("left") || pagingState == "middle") { 
    <a class="next" id="next" href="#" onclick="ajaxFilterSearch(...);"> 
     @umbraco.library.GetDictionaryItem("Next")<img src="/img/buttons/pink-hand-right.png" /> 
    </a> 
} 

我已经缩短了更好的可读性ajaxFilterSearch()电话。我希望这有助于:)