一尘不染

通过字典 到MVC控制器

json

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

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

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

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

在此处输入图片说明

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

使用提琴手,我能够看到正在传递到我的控制器,并且看不到这两个值正在传递..

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

我很沮丧


阅读 258

收藏
2020-07-27

共1个答案

一尘不染

它附加两个值,因为默认情况下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.FactoriesRouteDataValueProviderFactory从中删除。但是,您的路由可能会遇到参数绑定问题。

2020-07-27