Bindowanie napisu do tablicy intów w ASP MVC

12

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!

Share.

About Author

Programista, trener, prelegent, pasjonat, blogger. Autor podcasta programistycznego: DevTalk.pl. Jeden z liderów Białostockiej Grupy .NET i współorganizator konferencji Programistok. Od 2008 Microsoft MVP w kategorii .NET. Więcej informacji znajdziesz na stronie O autorze. Napisz do mnie ze strony Kontakt. Dodatkowo: Twitter, Facebook, YouTube.

12 Comments

  1. makabryczny_boo on

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

  2. makabryczny_boo on

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

  3. 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

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

  5. 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?

  6. 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.

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

  8. [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 !

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

Newsletter: devstyle weekly!
Dołącz do 1000 programistów!
  Zero spamu. Tylko ciekawe treści.
Dzięki za zaufanie!
Do przeczytania w najbliższy piątek!
Niech DEV będzie z Tobą!