fbpx
devstyle.pl - Blog dla każdego programisty
devstyle.pl - Blog dla każdego programisty
< 1 minut

Bindowanie napisu do tablicy intów w ASP MVC


16.06.2011

Standardowo jeśli chcemy przekazać w URLu tablicę w MVC to wysyłamy po prostu wiele wartości o tej samej nazwie, np ?array=1&array=2&array=3. Może się jednak zdarzyć, że przydałoby się to jakoś “skompaktować”, na przykład do takiej postaci: ?array=1,2,3. Co wtedy?

Da się to osiągnąć w dość prosty sposób implementując własny ModelBinder:

  1:  public class CommaSeparatedIntArrayModelBinder : IModelBinder
  2:  {
  3:  	public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  4:  	{
  5:  		var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
  6:  
  7:  		if (result == null)
  8:  			return null;
  9:  
 10:  		if (result.AttemptedValue.HasNoText())
 11:  			return null;
 12:  
 13:  		return result.AttemptedValue.Split(',').Select(x => int.Parse(x)).ToArray();
 14:  	}
 15:  }

Potem tylko rejestrujemy go w Global.asax:

  1:  ModelBinders.Binders[typeof (int[])] = new CommaSeparatedIntArrayModelBinder();

i gra muzyka!

0 0 votes
Article Rating
12 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
makabryczny_boo
makabryczny_boo
12 years ago

Nuda, nuda i nuda. Znacznie bardziej ciekawszy poziom reprezentują hasła poruszone przez twoje programistyczne kazania.

procent
12 years ago

makabryczny_boo,
Programistyczne kazania?

makabryczny_boo
makabryczny_boo
12 years ago

Mam tu na myśli wątki z serii "Słowo na niedzielę" oraz "Zawód programista".

procent
12 years ago

A, no tak. Przyznaję że mogą być ciekawsze niż czysto techniczne wpisy, ale:
* dzisiaj nie niedziela:)
* przygotowanie sensownego tekstu "luźnego" wymaga dużo czasu (zwykle 4-5 godzin, czasami więcej) więc siłą rzeczy publikuję je rzadziej

makabryczny_boo
makabryczny_boo
12 years ago

Szkoda, czasem chciałbym móc zmienić dzień :-)

aaa
aaa
12 years ago

I Exception, gdy użytkownik zmieni w adresie jakąś cyferkę na literkę

aaa
aaa
12 years ago

Poza tym chyba […].Select(int.Parse).ToArray() […]

Kogut
Kogut
12 years ago

Jestem początkujący może to głupie o co spytam, ale bardzo mnie interesuje czemu nie stosujesz deklaratywnej formy wyrażeń linq tylko bezpośrednią formę?

Czy wyrażenie jedno liniowe są lepsze?

procent
12 years ago

aaa,
Wyjątek wyjątkiem, pokazałem przykład co można zrobić. A ulepszyć można każdy kawałek kodu.
Co do Select(int.Parse)… no można i tak, chociaż ja preferuję jawnie przekazywać parametry do lambd.

procent
12 years ago

Kogut,
Oba sposoby pisania linq są równoznaczne, na poziomie kompilacji i tak kompilator C# zamienia wszystko na postać wywoływania metod. Ja piszę tak, bo tak mi jest po prostu wygodniej. Czasami stosuję alternatywną notację, ale to raczej tylko wtedy gdy chcę skorzystać z "let" lub grupowania.

krajew4
12 years ago

[quote]Warning 70 SA1503: The body of the if statement must be wrapped in opening and closing curly brackets. [/quote]
Anyway własnie mi się przydał ten kawałek kodu :). Zaglądam regularnie na bloga – szkoda, że tak rzadko pisujesz. Pozdrawiam !

procent
12 years ago

krajew4,
Nie korzystam z żadnego faszystowskiego narzędzia do analizy kodu (poza Resharperem).

Dobrze że kod się przydał, a czy rzadko pisuję… to już raczej kwestia osobistych obserwacji i porównań, częściej nie dam rady:).

Kurs Gita

Zaawansowany frontend

Szkolenie z Testów

Szkolenie z baz danych

Książka

Zobacz również


Notice: ob_end_flush(): failed to delete and flush buffer. No buffer to delete or flush in /home/klient.dhosting.pl/mdevstyle/devstyle.pl/public_html/wp-content/themes/devstyle/functions.php on line 69