Передача словаря <string, object> в MVC Controller

Я пытаюсь передать объект javascript (пары значений ключа) в действие MVC Controller с помощью AJAX.

Действие контроллера имеет параметр словаря, который получает объект.

[HttpPost]
public ActionResult SearchProject(IDictionary<string, object> filter ...

Когда этот объект пустой (его значение в javascript равно {}), в моем отладчике я вижу следующее.

enter image description here

Почему имена контроллеров и действий автоматически добавляются в параметр Dictionary?

С помощью fiddler я могу видеть, что передается моему контроллеру, и я не вижу этих двух значений.

Если объект javascript не пуст, все работает отлично

Я в тупике.

Ответ 1

Он добавляет два значения, потому что по умолчанию MVC регистрирует такой ValueProviderFactory:

public sealed class RouteDataValueProviderFactory : ValueProviderFactory

Это возвращает реализацию IValueProvider - RouteDataValueProvider:

public sealed class RouteDataValueProvider : DictionaryValueProvider<object>
{
    // RouteData should use the invariant culture since it part of the URL, and the URL should be
    // interpreted in a uniform fashion regardless of the origin of a particular request.
    public RouteDataValueProvider(ControllerContext controllerContext)
        : base(controllerContext.RouteData.Values, CultureInfo.InvariantCulture)
    {
    }
}

В основном, он просто связывает словарь для маршрутизации значений для текущего маршрута.

Например, если вы добавляете такие данные в маршруты в RouteConfig:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}",
    defaults: new { controller = "Home", action = "Index", SomeSpecificRouteData = 42 }
);

Тогда ваш словарь будет иметь 3 значения - controller, action и SomeSPecificRouteData.

Другой пример: вы можете определить такое действие:

public ActionResult Index(string action, string controller, int SomeSpecificRouteData)

и RouteDataValueProvider будут передавать данные с вашего маршрута в качестве параметров для этого метода. Таким образом MVC связывает параметры от маршрутов к фактическим параметрам для действий.

Если вы хотите удалить такое поведение, вам просто нужно выполнить итерацию по ValueProviderFactories.Factories и удалить из него RouteDataValueProviderFactory. Но тогда ваши маршруты могут иметь проблемы с привязкой параметров.