我正在尝试使用AJAX将javascript对象(键值对)传递给MVC Controller操作。
控制器操作具有接收对象的Dictionary参数。
[HttpPost] public ActionResult SearchProject(IDictionary<string, object> filter ...
当有问题的对象为 空时 (意味着它在javascript中的值为{}),我在调试器中看到以下内容。
为什么控制器和动作名称会自动添加到Dictionary参数中?
使用提琴手,我能够看到正在传递到我的控制器,并且看不到这两个值正在传递..
如果javascript对象不为空,则一切正常
我很沮丧
它附加两个值,因为默认情况下MVC注册了这样的ValueProviderFactory:
public sealed class RouteDataValueProviderFactory : ValueProviderFactory
返回IValueProvider- RouteDataValueProvider的实现:
public sealed class RouteDataValueProvider : DictionaryValueProvider<object> { // 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) { } }
基本上,它只是将Dictionary绑定到当前路由的路由值。
例如,如果您将此类数据添加到的路由中RouteConfig:
RouteConfig
routes.MapRoute( name: "Default", url: "{controller}/{action}", defaults: new { controller = "Home", action = "Index", SomeSpecificRouteData = 42 } );
那么你的字典将有3个值- controller,action和SomeSPecificRouteData。
controller
action
SomeSPecificRouteData
另一个示例是您可以定义此类操作:
public ActionResult Index(string action, string controller, int SomeSpecificRouteData)
并将RouteDataValueProvider您路线中的数据作为参数传递给这些方法。这样,MVC将路由的参数绑定到操作的实际参数。
RouteDataValueProvider
如果要删除此类行为,则只需进行迭代ValueProviderFactories.Factories并RouteDataValueProviderFactory从中删除。但是,您的路由可能会遇到参数绑定问题。
ValueProviderFactories.Factories
RouteDataValueProviderFactory