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!

Nie przegap kolejnych postów!

Dołącz do ponad 9000 programistów w devstyle newsletter!

Tym samym wyrażasz zgodę na otrzymanie informacji marketingowych z devstyle.pl (doh...). Powered by ConvertKit
Notify of
makabryczny_boo
makabryczny_boo

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

procent

makabryczny_boo,
Programistyczne kazania?

makabryczny_boo
makabryczny_boo

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

procent

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

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

aaa
aaa

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

aaa
aaa

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

Kogut
Kogut

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

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

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

[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

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

Moja książka

Facebook

Zobacz również