Sortowanie tabeli po stronie servera (MVC)

0

Hej!
Tworzę aplikację w ASP MVC i w widoku mam stworzoną tabelę wyświetlającą pewne dane z modelu.

Chcę dodać możliwość sortowania według kolumn ( najlepiej z możliwością sortowania według kilku kolumn ) po stronie servera.

Zrobiłem to ale nieelegancko a chciałbym to zrobić tak jak jest to przyjęte w ogólnych wzorcach.

Do tej pory klikając na nagłówek kolumny przesyłam metodą GET nazwę sortowanej kolumny do kontrolera, skąd ta nazwa idzie do modelu, który pobiera dane posortowane według danej kolumny.

Przykładowy url wygląda tak: http://localhost:/Kontakty?kolumna=Kontakt.Nazwisko

Wady:

  1. Ręczne edytowanie adresu url może powodować błędy. ( np wpisanie nazwy kolumny której nie ma )
  2. Za każdym razem jak zmienię nazwę w kolumny w bazie danych muszę zmieniać tą nazwę w programie
  3. Nazwa kolumny jest w widoku.
  4. Brak możliwośći sortowania według kilku kolumn

poza tym później bedę chciał dodać stronicowanie takiej tabeli.

Byłbym wdzięczny za jakieś wskazówki jak podejść do tego typu problemów i jakie zastosować rozwiązania.

pozdrawiam!

0

A czemu recznie wpisujesz adres? Przeciez mozesz wstawic w to miejsce nazwe pola modelu (np uzywajac reflection);

Majac nazwe pola rozwiazujesz problem 1,2 i 4.

  1. Nazwa kolumny jest w widoku - mozesz uzyc jakiegos szyfrowania dwustronnego, albo zrobic hash nazwy (ale wtedy to juz wiecej zabawy w szukanie kolumny. Lub tez po prostu po numerze kolumny nasztywno zdefiniowac sortowanie (najmniej elastyczny sposob). Ja bym nazwe kolumny zakodowal np w base64 i tyle :)

Problemem moze byc jesli nazwa pola nie przeklada sie na nazwe pola w bazie danych. Wtedy jakies dodatkowe mapowanie by bylo potrzebne. Ale to juz zalezy od tego w jaki sposob pobierasz dane do modelu.

Mozliwe, ze jest jakis atrybut, ktory rozwiazuje problem takiego mapowania przez atrybuty pol modelu (w mvc 2 widzialem, ze wiele fajnych rzeczy wprowadzili), no ale niestety do tego jeszcze nie doszedlem, wiec jesli ktos takie cos zna to z checia sam sie dowiem :)

0

Hej!
Dzięki za podpowiedź.
Ja mapuję bazę za pomocą LinQ to sql i pola modelu odpowiadają polom w bazie.

wasiu napisał(a)

A czemu recznie wpisujesz adres? Przeciez mozesz wstawic w to miejsce nazwe pola modelu (np uzywajac reflection);

Z początku też myślałem o Reflection ale prawdę powiedziawszy nie wiem poco go tutaj użyć :) Pewnie czegoś nie wiem.
Gdybym użył to tak:

PropertyInfo propertyInfo = typeof(Kontakt).GetProperty("Nazwisko");

string nazwaKolumny = propertyInfo.Name; 

To i tak w argumencie GetProperty muszę "ręcznie" wpisać "Nazwisko"

Z szyfrowaniem dobry pomysł - dzięki !

Tym nie mniej mam 2. bardzo uciążliwy dla mnie problem. Chodzi o sortowanie po wielu kolumnach. Myślałem, że w Modelu bedę mógł w zmiennej globalnej przechować nazwę dotychczasowej kolumny, po której ostatnio posortowałem a okazuje się, że te dane znikają za każdym razem. ( w kontrolerze tak samo )

Inaczej musiałbym nazwy poprzednich kolumn jeszcze raz przesłać do widoku i z powrotem do kontrolera i modelu ( trochę na około )

pozdrawiam!

0

Wamer, faktycznie zapedzilem sie z tym reflection, bo ostatecznie zatacza sie kolo.

Zatem pozostaje Ci jednak string :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1