将 Dictionary<string, object> 传递给 MVC 控制器

Posted

技术标签:

【中文标题】将 Dictionary<string, object> 传递给 MVC 控制器【英文标题】:Passing Dictionary<string, object> to MVC Controller 【发布时间】:2014-02-17 11:04:33 【问题描述】:

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

控制器动作有一个接收对象的字典参数。

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

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

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

使用提琴手我可以看到传递给我的控制器的内容,但我没有看到这两个值被传递..

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

我被难住了..

【问题讨论】:

你有没有得到这个工作?接受的答案无助于从 JSON 帖子中获取 Dictionary ... 【参考方案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.Factories 并从中删除 RouteDataValueProviderFactory。但是你的路由可能会遇到参数绑定问题。

【讨论】:

这并没有真正回答......在我的场景中,它是一个IDictionary&lt;string, IEnumerable&lt;...&gt;&gt;,我检查了一个空集的值。如果检测到它,另一种方法是清空它:if(filter.ContainsKey("controller")) filter = new IDictionary&lt;...&gt;(). 其实filter.Remove("controller"); filter.Remove("action"); 效果很好。 这是非常糟糕和意想不到的行为,这背后有什么原因吗?特别是当我的字典参数设置了默认值时。

以上是关于将 Dictionary<string, object> 传递给 MVC 控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Optional<Dictionary<String, Any>> 转换为 Dictionary<String, Any> 以发送带有 json 参数的 A

C# 将 List<string> 转换为 Dictionary<string, string>

将 XML 转换为 Dictionary<String,String>

WPF MVVM 将 Dictionary<String, List<String>> 绑定到数据网格

将 Dictionary<string, string> 转换为 xml 的简单方法,反之亦然

无法将 Dictionary<string, List<string>> 转换为 IReadOnlyDictionary<string, IReadOnlyCollect