将 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它附加了两个值,因为默认情况下 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
。但是你的路由可能会遇到参数绑定问题。
【讨论】:
这并没有真正回答......在我的场景中,它是一个IDictionary<string, IEnumerable<...>>
,我检查了一个空集的值。如果检测到它,另一种方法是清空它:if(filter.ContainsKey("controller")) filter = new IDictionary<...>()
.
其实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