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!