将Dictionary <string,object =“”>传递给MVC控制器</string,>

时间:2014-01-26 17:30:52

标签: c# javascript json asp.net-mvc-4

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

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

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

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

enter image description here

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

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

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

我很难过..

1 个答案:

答案 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个值 - controlleractionSomeSPecificRouteData

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

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

RouteDataValueProvider会将您路线中的数据作为参数传递给这些方法。 通过这种方式,MVC将路径中的参数绑定到操作的实际参数。

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