将Dictionary 传递给MVC Controller

我试图使用AJAX将javascript对象(键值对)传递给MVC Controller操作。

控制器操作具有接收对象的Dictionary参数。

[HttpPost] public ActionResult SearchProject(IDictionary filter ... 

当有问题的对象为 (意味着它在javascript中的值为{})时,我在调试器中看到以下内容。

在此处输入图像描述

为什么控制器和操作名称会自动添加到Dictionary参数中?

使用fiddler我能够看到传递给我的控制器的内容,我没有看到传递这两个值。

如果javascript对象不为空,那么一切正常

我很难过..

它附加两个值,因为默认情况下MVC注册了ValueProviderFactory:

 public sealed class RouteDataValueProviderFactory : ValueProviderFactory 

返回IValueProvider的实现 – RouteDataValueProvider :

 public sealed class RouteDataValueProvider : DictionaryValueProvider { // RouteData should use the invariant culture since it's 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 } ); 

那么你的Dictionary将有3个值 – controlleractionSomeSPecificRouteData

另一个示例是您可以定义此类操作:

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

RouteDataValueProvider将路由中的数据作为参数传递给这些方法。 以这种方式,MVC将路径中的参数绑定到动作的实际参数。

如果要删除此类行为,只需迭代ValueProviderFactories.Factories并从中删除RouteDataValueProviderFactory 。 但是,您的路线可能会出现参数绑定问题。