我正在尝试使用AJAX将javascript对象(键值对)传递给MVC Controller操作。
控制器操作有一个接收对象的Dictionary参数。
[HttpPost]
public ActionResult SearchProject(IDictionary<string, object> filter ...
如果有问题的对象为空(意味着它在javascript中的值为{}),我会在调试器中看到以下内容。
为什么控制器和动作名称会自动添加到Dictionary参数?
使用fiddler我能够看到传递给我的控制器的内容,我没有看到传递这两个值..
如果javascript对象不为空,那么一切正常
我很难过..
答案 0 :(得分:5)
它附加两个值,因为默认情况下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
中的路径:
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
即可。但是,您的路线可能会出现参数绑定问题。