patterncsharpMinor
Stack Overflow like pager
Viewed 0 times
pageroverflowlikestack
Problem
I've been working on a Stack Overflow like pager for my personal use and I've gotten everything working pretty good. Some of my logic is a bit suspect though, especially the logic in the Pager class itself. I thought I'd try posting this code on here just to see what sort of responses I got. I included my test cases as well. Some of the test names might be weird, but I'll go back and fix that later.
```
public class Pager {
public int TotalPages { get; private set; }
public int SelectedItem { get; private set; }
public int PageNumbersToShow { get; set; }
public string CssClass { get; set; }
public Pager(int selectedItem, int totalPages, int pageNumbersToShow = 5) {
this.SelectedItem = selectedItem;
this.TotalPages = totalPages;
this.PageNumbersToShow = pageNumbersToShow;
this.CssClass = "pager fl";
}
public override string ToString() {
var finalString = new StringBuilder();
var pagerDiv = new TagBuilder("div");
pagerDiv.AddCssClass(CssClass);
//prev 1 2 (3)
//prev 1 (2) 3 next
// (1) 2 3 next
if (TotalPages PageNumbersToShow) {
for (int i = 1; i PageNumbersToShow && TotalPages - (PageNumbersToShow - 1) = PageNumbersToShow && TotalPages - (PageNumbersToShow - 1) >= SelectedItem) {
finalString.Append(new PageNumber(1).ToString());
finalString.Append(new PageNumber().ToString());
var middle = (PageNumbersToShow / 2);
for (int i = SelectedItem - middle; i 1");
}
// (1) 2 3 next
[TestMethod]
public void Should_Not_Print_Out_Previous_If_Selected_Page_Is_First_In_List_Smaller_Than_Five() {
//Arrange
StringBuilder expectedValue = new StringBuilder();
var pager = new Pager(1, 3);
//Act
var result = pager.ToString();
//Assert
expectedValue.Append(@"");
expectedValue.Append(@"1");
expectedValue.Append(@"2");
expectedValue.Append(@"3");
expectedValu
```
public class Pager {
public int TotalPages { get; private set; }
public int SelectedItem { get; private set; }
public int PageNumbersToShow { get; set; }
public string CssClass { get; set; }
public Pager(int selectedItem, int totalPages, int pageNumbersToShow = 5) {
this.SelectedItem = selectedItem;
this.TotalPages = totalPages;
this.PageNumbersToShow = pageNumbersToShow;
this.CssClass = "pager fl";
}
public override string ToString() {
var finalString = new StringBuilder();
var pagerDiv = new TagBuilder("div");
pagerDiv.AddCssClass(CssClass);
//prev 1 2 (3)
//prev 1 (2) 3 next
// (1) 2 3 next
if (TotalPages PageNumbersToShow) {
for (int i = 1; i PageNumbersToShow && TotalPages - (PageNumbersToShow - 1) = PageNumbersToShow && TotalPages - (PageNumbersToShow - 1) >= SelectedItem) {
finalString.Append(new PageNumber(1).ToString());
finalString.Append(new PageNumber().ToString());
var middle = (PageNumbersToShow / 2);
for (int i = SelectedItem - middle; i 1");
}
// (1) 2 3 next
[TestMethod]
public void Should_Not_Print_Out_Previous_If_Selected_Page_Is_First_In_List_Smaller_Than_Five() {
//Arrange
StringBuilder expectedValue = new StringBuilder();
var pager = new Pager(1, 3);
//Act
var result = pager.ToString();
//Assert
expectedValue.Append(@"");
expectedValue.Append(@"1");
expectedValue.Append(@"2");
expectedValue.Append(@"3");
expectedValu
Solution
It's a little wonky to have a
Then do all dis bizness in the toString() method
You've created a class to encapsulate a PageNumber. It would make more sense to have the Pager hold a list of these.
If you're thinking along these lines already, then a Pager is really just a Composite of PageNumbers.
Don't do so much business logic processing in your toString() methods and constructors. Most of that logic should be in utility methods devoted to their particular tasks. For example
public int PageNumbersToShow { get; set; }Then do all dis bizness in the toString() method
if (TotalPages <= PageNumbersToShow) {
for (int i = 1; i <= TotalPages; i++) {
finalString.Append(new PageNumber(i, (SelectedItem == i)).ToString());
}
}You've created a class to encapsulate a PageNumber. It would make more sense to have the Pager hold a list of these.
If you're thinking along these lines already, then a Pager is really just a Composite of PageNumbers.
Don't do so much business logic processing in your toString() methods and constructors. Most of that logic should be in utility methods devoted to their particular tasks. For example
if (Current) {
span.AddCssClass("current");
return span.ToString();
} else {
if (span.ToString().Contains("dots")) {
return span.ToString();
}- What if I wanna add another CSS class later?
- What if I decide to change from to
- like a reasonable person?
- What if I wanna add javascript events?
Code Snippets
public int PageNumbersToShow { get; set; }if (TotalPages <= PageNumbersToShow) {
for (int i = 1; i <= TotalPages; i++) {
finalString.Append(new PageNumber(i, (SelectedItem == i)).ToString());
}
}if (Current) {
span.AddCssClass("current");
return span.ToString();
} else {
if (span.ToString().Contains("dots")) {
return span.ToString();
}Context
StackExchange Code Review Q#1585, answer score: 7
Revisions (0)
No revisions yet.