namespace System.Web.Mvc { using System; using System.Collections.Generic; using System.Globalization; using System.Linq; public sealed class HttpFileCollectionValueProvider : DictionaryValueProvider { private static readonly Dictionary _emptyDictionary = new Dictionary(); public HttpFileCollectionValueProvider(ControllerContext controllerContext) : base(GetHttpPostedFileDictionary(controllerContext), CultureInfo.InvariantCulture) { } private static Dictionary GetHttpPostedFileDictionary(ControllerContext controllerContext) { HttpFileCollectionBase files = controllerContext.HttpContext.Request.Files; // fast-track common case of no files if (files.Count == 0) { return _emptyDictionary; } // build up the 1:many file mapping List> mapping = new List>(); string[] allKeys = files.AllKeys; for (int i = 0; i < files.Count; i++) { string key = allKeys[i]; if (key != null) { HttpPostedFileBase file = HttpPostedFileBaseModelBinder.ChooseFileOrNull(files[i]); mapping.Add(new KeyValuePair(key, file)); } } // turn the mapping into a 1:many dictionary var grouped = mapping.GroupBy(el => el.Key, el => el.Value, StringComparer.OrdinalIgnoreCase); return grouped.ToDictionary(g => g.Key, g => g.ToArray(), StringComparer.OrdinalIgnoreCase); } } }