避免将Dictionary <string,t =“”>绑定到所有查询字符串参数

时间:2016-10-11 14:10:01

标签: c# .net asp.net-mvc

在C#ASP.NET MVC项目中,我有一个动作接收Dictionary<string, T>T类型并不重要,我认为)作为参数。我还希望该参数是可选的,默认值为null

但是,如果我在调用操作时没有指定该参数,我仍然会得到它,一个填充了所有查询字符串键值对的字典。

我理解它的方式,MVC框架尝试将参数绑定到查询字符串,并且因为它是具有字符串键的字典,所以查询字符串中键 - 值对的集合是数据绑定机制的合适数据。

但我仍然需要能够接收null参数。并且我不允许在路线值中明确地传递null。我怎么能阻止查询字符串数据绑定发生?

1 个答案:

答案 0 :(得分:2)

不要将模型参数定义为Dictionary,而是创建需要更明确绑定的模型

这样的东西
 ModelClass { 
    string SomeName {get;set;} 
    T Internal {get;set;}
}

public ActionResult YourAction(ModelClass boundInstance){}

这肯定不会受到随机查询字符串参数的约束。请注意,定义为可选参数的任何模型对象永远不会为空,它们将只有空数据,即使在没有查询字符串参数的情况下,您仍然会以构造但空的Dic()结束。默认模型绑定器在尝试绑定数据之前调用任何参数为空构造函数,因此即使没有数据可以绑定到该对象,也会构造该对象。

其他选项 - 如果您只打算从帖子中获取字典数据,则可以将属性[FromBody]添加到绑定

public ActionResult YourAction([FromBody]Dictionary<string, T> boundInstance){}

Rant:避免使用通用集合类型作为操作参数,您可以完全避免这些问题。