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!
Nuda, nuda i nuda. Znacznie bardziej ciekawszy poziom reprezentują hasła poruszone przez twoje programistyczne kazania.
makabryczny_boo,
Programistyczne kazania?
Mam tu na myśli wątki z serii "Słowo na niedzielę" oraz "Zawód programista".
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
Szkoda, czasem chciałbym móc zmienić dzień :-)
I Exception, gdy użytkownik zmieni w adresie jakąś cyferkę na literkę
Poza tym chyba […].Select(int.Parse).ToArray() […]
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?
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.
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.
[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 !
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:).