public static class WebGridExtensions
{
public static HelperResult PagerList(
this WebGrid webGrid,
WebGridPagerModes mode = WebGridPagerModes.NextPrevious | WebGridPagerModes.Numeric,
string firstText = null,
string previousText = null,
string nextText = null,
string lastText = null,
int numericLinksCount = 5)
{
return PagerList(webGrid, mode, firstText, previousText, nextText, lastText, numericLinksCount, explicitlyCalled: true);
}
private static HelperResult PagerList(
WebGrid webGrid,
WebGridPagerModes mode,
string firstText,
string previousText,
string nextText,
string lastText,
int numericLinksCount,
bool explicitlyCalled)
{
int currentPage = webGrid.PageIndex;
int totalPages = webGrid.PageCount;
int lastPage = totalPages - 1;
var ul = new TagBuilder("ul");
var li = new List<TagBuilder>();
if (ModeEnabled(mode, WebGridPagerModes.FirstLast)) {
if (String.IsNullOrEmpty(firstText)) {
firstText = "اولین";
}
var part = new TagBuilder("li") {
InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(0), firstText)
};
if (currentPage == 0) {
part.MergeAttribute("class", "disabled");
}
li.Add(part);
}
if (ModeEnabled(mode, WebGridPagerModes.NextPrevious)) {
if (String.IsNullOrEmpty(previousText)) {
previousText = "قبلی";
}
int page = currentPage == 0 ? 0: currentPage - 1;
var part = new TagBuilder("li") {
InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(page), previousText)
};
if (currentPage == 0) {
part.MergeAttribute("class", "disabled");
}
li.Add(part);
}
if (ModeEnabled(mode, WebGridPagerModes.Numeric) && (totalPages > 1)) {
int last = currentPage + (numericLinksCount / 2);
int first = last - numericLinksCount + 1;
if (last > lastPage) {
first -= last - lastPage;
last = lastPage;
}
if (first < 0) {
last = Math.Min(last + (0 - first), lastPage);
first = 0;
}
for (int i = first; i <= last; i++) {
var pageText = (i + 1).ToString(CultureInfo.InvariantCulture);
var part = new TagBuilder("li") {
InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(i), pageText)
};
if (i == currentPage) {
part.MergeAttribute("class", "active");
}
li.Add(part);
}
}
if (ModeEnabled(mode, WebGridPagerModes.NextPrevious)) {
if (String.IsNullOrEmpty(nextText)) {
nextText = "بعدی";
}
int page = currentPage == lastPage ? lastPage: currentPage + 1;
var part = new TagBuilder("li") {
InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(page), nextText)
};
if (currentPage == lastPage) {
part.MergeAttribute("class", "disabled");
}
li.Add(part);
}
if (ModeEnabled(mode, WebGridPagerModes.FirstLast)) {
if (String.IsNullOrEmpty(lastText)) {
lastText = "آخرین";
}
var part = new TagBuilder("li") {
InnerHtml = GridLink(webGrid, webGrid.GetPageUrl(lastPage), lastText)
};
if (currentPage == lastPage) {
part.MergeAttribute("class", "disabled");
}
li.Add(part);
}
ul.InnerHtml = string.Join("", li);
var html = "";
if (explicitlyCalled && webGrid.IsAjaxEnabled) {
var span = new TagBuilder("span");
span.MergeAttribute("data-swhgajax", "true");
span.MergeAttribute("data-swhgcontainer", webGrid.AjaxUpdateContainerId);
span.MergeAttribute("data-swhgcallback", webGrid.AjaxUpdateCallback);
span.InnerHtml = ul.ToString();
html = span.ToString();
} else {
html = ul.ToString();
}
return new HelperResult(writer => {
writer.Write(html);
});
}
private static String GridLink(WebGrid webGrid, string url, string text)
{
TagBuilder builder = new TagBuilder("a");
builder.SetInnerText(text);
builder.MergeAttribute("href", url);
if (webGrid.IsAjaxEnabled) {
builder.MergeAttribute("data-swhglnk", "true");
}
return builder.ToString(TagRenderMode.Normal);
}
private static bool ModeEnabled(WebGridPagerModes mode, WebGridPagerModes modeCheck)
{
return (mode & modeCheck) == modeCheck;
}
}