2

AJAX を使用した Umbracos Razor ビューエンジンのページング メカニズムを理解するのに苦労しています。

つまり、ページングは​​次のようにする必要があります。

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

ユーザーが必要以上のものをクリックした場合、次の4ようにする必要があります。

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

そのため、前の 2 ページと次のページが表示されます。

ここで、ユーザーが最後の 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ユーザーがクリックしたページ番号です。

上記のコードが複雑で見栄えが悪いことは承知していますが、ヘルプ/ヒントは大歓迎です!

前もって感謝します。

4

1 に答える 1

1

このアプローチはどうでしょうか。ページングには 3 つの可能な状態と 7 つのコンポーネントがあると考えることができます。状態 #1 は、私が呼ぶものですleft(またはleft_extended合計 4 ページを超える場合)。これは、ユーザーがまだ最初の 4 ページにいるときです。状態 #2 はmiddle、ユーザーがナビゲートしていて、まだ最後の 4 ページに到達していないときです。状態 #3 はright、ユーザーが最後の 4 ページに到達したことを意味します。

7 つのコンポーネントは次のように配置されます。

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

真ん中のコンポーネントは、6 | 7 | 8 | 9 | 10私が と呼んでいるものですmiddle block。3 つの状態と 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()読みやすくするために呼び出しを短くしました。これが役立つことを願っています:)

于 2013-03-26T16:27:21.217 に答える