C#, mvc, skriver ut mitt sökresultat, ska nu "page:a" det.

Permalänk
Medlem

C#, mvc, skriver ut mitt sökresultat, ska nu "page:a" det.

Använder mig av c# mvc och får ut ett sökresultat genom foreach (produkt in model) i en usercontroll.
Jag vill nu använda mig av paging.

Vet inte riktigt hur jag ska gå tillväga. Tänkte om jag tar antalet funna produkter / 12 (avrundat) så får jag hur många listor/sidor det ska vara.
Sen får jag fylla varje lista med 12 i varje och binda de till varje sida.

Är jag inne på rätt spår? Googlat runt en del men har blivit rätt så grötigt.

Permalänk
Medlem

Gör en kontrollermetod Page som tar parametrarna itemsPer och n, sedan:

var startItem = itemsPer * n; allaArtiklar.Skip(startItem).Take(itemsPer).ToList(); // detta är ditt urval

Lägg till itemsPer, n och urvalet i modellen så det finns tillgängligt i vyn. Lägg även till allaArtiklar.Count() / itemsPer (== antal sidor).
Anropa denna metod från Index() med n=0 och itemsPer=default antal per sida för att få första sidan.

Skickades från m.sweclockers.com

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Gör en kontrollermetod Page som tar parametrarna itemsPer och n, sedan:

var startItem = itemsPer * n; allaArtiklar.Skip(startItem).Take(itemsPer).ToList(); // detta är ditt urval

Lägg till itemsPer, n och urvalet i modellen så det finns tillgängligt i vyn. Lägg även till allaArtiklar.Count() / itemsPer (== antal sidor).
Anropa denna metod från Index() med n=0 och itemsPer=default antal per sida för att få första sidan.

Skickades från m.sweclockers.com

Glöm inte lägga hiddens för vilken sida man är på.
Skulle dock döpt fieldsen till:
n = pageIndex
itemsPer = pageSize

För att vara lite mer c#-ig

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Skrivet av KurreKula:

Glöm inte lägga hiddens för vilken sida man är på.
Skulle dock döpt fieldsen till:
n = pageIndex
itemsPer = pageSize

För att vara lite mer c#-ig

Orkade inte skriva mer med mobilen

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Orkade inte skriva mer med mobilen

Haha, jo jag såg att det var skrivet på mobilen. Creds ^^

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Skrivet av KurreKula:

Haha, jo jag såg att det var skrivet på mobilen. Creds ^^

Jag blev lite nyfiken, vad gör hidden input för nytta när man har sidnumret i modellen? Något magiskt C#-trick?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Jag blev lite nyfiken, vad gör hidden input för nytta när man har sidnumret i modellen? Något magiskt C#-trick?

Du måste ju fortfarande göra ett fält för sidonumret i modellen. Det skickas ju inte vidare till nästa paging om du inte använder dig av det i formuläret

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Skrivet av KurreKula:

Du måste ju fortfarande göra ett fält för sidonumret i modellen. Det skickas ju inte vidare till nästa paging om du inte använder dig av det i formuläret

Att det ska ligga i modellen är jag med på, men varför skapa ett dolt fält från det som ligger i modellen? Alltså, varför skulle man vilja skicka sidan man för tillfället besöker till servern istället för den man vill komma till?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Att det ska ligga i modellen är jag med på, men varför skapa ett dolt fält från det som ligger i modellen? Alltså, varför skulle man vilja skicka sidan man för tillfället besöker till servern istället för den man vill komma till?

Ja, det kan jag hålla med om. Då man gör get-länkar för alla olika sidor så behöver man ju inte använda sig av hiddens, det har du rätt i.

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

blev att jag returnerade en class där jag sparade min lista + pageCount (antalet träffar i sökningen / 12) + pageNumber (är hur många jag skippar, tex 2. Då skippar jag 2*12).

Får klassen till min vy där jag skriver ut den. Sen lite if satset på knapparna om de ska synas eller ej.

Permalänk
Skrivet av MB:

blev att jag returnerade en class där jag sparade min lista + pageCount (antalet träffar i sökningen / 12) + pageNumber (är hur många jag skippar, tex 2. Då skippar jag 2*12).

Får klassen till min vy där jag skriver ut den. Sen lite if satset på knapparna om de ska synas eller ej.

Problemet blir när du har en gigantisk lista. Då skickar du all data fram och tillbaka

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

ok så fördelen är med det tidigare alternativet att man bara skickar den en gång? istället för två gånger nu?

Permalänk
Medlem
Skrivet av MB:

ok så fördelen är med det tidigare alternativet att man bara skickar den en gång? istället för två gånger nu?

Det är "rättare" att göra behandling av data i Controller-metoden, t ex urval ur en lista med sidor, och bara skicka vidare det som faktiskt ska visas till vyn. Datan som skickas mellan din server och användaren blir naturligtvis inte större även om du skickar hela listan till view:en, men du tvingas filtrera den "på plats" vilket bryter mot MVC-konceptet.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Det är "rättare" att göra behandling av data i Controller-metoden, t ex urval ur en lista med sidor, och bara skicka vidare det som faktiskt ska visas till vyn. Datan som skickas mellan din server och användaren blir naturligtvis inte större även om du skickar hela listan till view:en, men du tvingas filtrera den "på plats" vilket bryter mot MVC-konceptet.

Ok anledningen var för att jag inte förstod hur jag skulle filtrera det i viewn.
För nu skickar jag inte med en lista med alla sökresultat. Utan först får jag säg 400 st av min söksträng. Av den "skippar" jag 0 st och tar 12 st och stoppar i min lista som jag skickar till min vy. Så filtreringen sker ju innan jag returnerar den.

Anledningen till att jag fastnade på erat exempel var ju just att jag fick in en söksträng + pageNumber till min Actionresult.
Av det sen gjorde jag min paging med diverse variablar som räknade ut det mesta av pageNumber.

Så sen när jag skulle returnera så kunde jag innan bara skicka min lista, alltså ej skicka med PageCount, PageNumber som jag sedan använde för att kunna ge egenskaper till mina knappar fram och tillbaka i "pagingen".

Men är nog mest för att jag inte riktigt behärskar MVC tänket och dess fördelar än. Av det jag suttit med programmering så har det varit i forms.

Permalänk
Medlem
Skrivet av MB:

Ok anledningen var för att jag inte förstod hur jag skulle filtrera det i viewn.
För nu skickar jag inte med en lista med alla sökresultat. Utan först får jag säg 400 st av min söksträng. Av den "skippar" jag 0 st och tar 12 st och stoppar i min lista som jag skickar till min vy. Så filtreringen sker ju innan jag returnerar den.

Anledningen till att jag fastnade på erat exempel var ju just att jag fick in en söksträng + pageNumber till min Actionresult.
Av det sen gjorde jag min paging med diverse variablar som räknade ut det mesta av pageNumber.

Så sen när jag skulle returnera så kunde jag innan bara skicka min lista, alltså ej skicka med PageCount, PageNumber som jag sedan använde för att kunna ge egenskaper till mina knappar fram och tillbaka i "pagingen".

Men är nog mest för att jag inte riktigt behärskar MVC tänket och dess fördelar än. Av det jag suttit med programmering så har det varit i forms.

Jag förstår ärligt talat inte vad du menar.

public ActionResult Index(string q) { // q = query return Page(q); } public ActionResult Page(string q, int p=0, int n=12) { // för kortare URL var resultSubset = SearchFor(q).Skip(p*n).Take(n).ToArray(); var dataModel = new SearchResultViewModel { PageIndex = p, ItemsPerPage = n, SearchResults = resultSubset }; return View(dataModel); }

Något sådant vill du ha.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Jag förstår ärligt talat inte vad du menar.

public ActionResult Index(string q) { // q = query return Page(q); } public ActionResult Page(string q, int p=0, int n=12) { // för kortare URL var resultSubset = SearchFor(q).Skip(p*n).Take(n).ToArray(); var dataModel = new SearchResultViewModel { PageIndex = p, ItemsPerPage = n, SearchResults = resultSubset }; return View(dataModel); }

Något sådant vill du ha.

Vad är dataModel? En klass av SearchResultViewModel?
Som sagt, är löst men intressant ändå för att lära sig.

Så här ser den ut som jag gjorde.. Förut returnerade den prods. Därav problemet när jag inte returnerade något mer.

public ActionResult Search(string search, int skip = 0)
{
List<Product> prods = new List<Product>();
var pageNumber = skip;
skip = skip * 12;
if (search != null)
{
prods = _prodRepos.GetByQuery(p => !p.IsDeleted && p.ImageCount > 0 && (p.Code.ToLower() == search.ToLower() || p.Name.ToLower().Contains(search.ToLower()) || p.ProductBrand.Name.ToLower().Contains(search.ToLower()))).OrderByDescending(p => p.DateAltered).ThenByDescending(p => p.TotalStock).ToList();
}

var pageCount = Math.Ceiling((double)prods.Count / 12);
prods = prods.Skip(skip).Take(12).ToList();

SearchResult searchResult = new SearchResult();
searchResult.Products = prods;
searchResult.PageCount = int.Parse(pageCount.ToString());
searchResult.PageNumber = int.Parse(pageNumber.ToString());

return PartialView("~/Views/Shared/SearchResult.ascx", searchResult);
//return PartialView("~/Views/Shared/SearchResult.ascx", prods.Skip(skip).Take(12).ToList()); <--- Så funkade men visste inte hur jag skulle lösa pagingen då.

Permalänk
Medlem
Skrivet av MB:

Vad är dataModel? En klass av SearchResultViewModel?

Alla variabler som definieras implicit är vad man tilldelar dem så ja, den är en SearchResultViewModel. Är det någon annan som skrivit din Controller-kod?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Japp. Jag fick fortsätta på någon annans verk.
Men skrivit så gott som allt utom linq-sats delen.