将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
基本上它只是绑定字典来路由当前路由的值。
例如,如果您将此类数据添加到RouteConfig
路由:
routes.MapRoute( name: "Default", url: "{controller}/{action}", defaults: new { controller = "Home", action = "Index", SomeSpecificRouteData = 42 } );
那么你的Dictionary将有3个值 – controller
, action
和SomeSPecificRouteData
。
另一个示例是您可以定义此类操作:
public ActionResult Index(string action, string controller, int SomeSpecificRouteData)
和RouteDataValueProvider
将路由中的数据作为参数传递给这些方法。 以这种方式,MVC将路径中的参数绑定到动作的实际参数。
如果要删除此类行为,只需迭代ValueProviderFactories.Factories
并从中删除RouteDataValueProviderFactory
。 但是,您的路线可能会出现参数绑定问题。