Bindowanie napisu do tablicy intów w ASP MVC

16 czerwca 2011 08:27 w kategorii: pro

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!


Komentarze

makabryczny_boo

16 czerwca 2011 12:21

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

procent

16 czerwca 2011 12:25

makabryczny_boo,
Programistyczne kazania?

makabryczny_boo

16 czerwca 2011 13:11

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

procent

16 czerwca 2011 13:17

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

16 czerwca 2011 13:20

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

dotnetomaniak.pl

16 czerwca 2011 18:56

Maciej Aniserowicz | Bindowanie napisu do tablicy intów w ASP MVC

Dziękujemy za publikację - Trackback z dotnetomaniak.pl

aaa

17 czerwca 2011 06:23

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

aaa

17 czerwca 2011 06:32

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

Kogut

17 czerwca 2011 08:44

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

17 czerwca 2011 12:01

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

17 czerwca 2011 12:02

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

29 czerwca 2011 22:14

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

procent

30 czerwca 2011 06:44

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:).

Komentarze zamknięte