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

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

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

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

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

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

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

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

我被难住了..

【问题讨论】:

  • 你有没有得到这个工作?接受的答案无助于从 JSON 帖子中获取 Dictionary ...

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


【解决方案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"); 效果很好。
  • 这是非常糟糕和意想不到的行为,这背后有什么原因吗?特别是当我的字典参数设置了默认值时。
猜你喜欢
  • 2012-05-13
  • 1970-01-01
  • 2021-08-10
  • 2015-07-02
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 2012-12-02
  • 2012-01-11
相关资源
最近更新 更多