在C#ASP.NET MVC项目中,我有一个动作接收Dictionary<string, T>
(T
类型并不重要,我认为)作为参数。我还希望该参数是可选的,默认值为null
。
但是,如果我在调用操作时没有指定该参数,我仍然会得到它,一个填充了所有查询字符串键值对的字典。
我理解它的方式,MVC框架尝试将参数绑定到查询字符串,并且因为它是具有字符串键的字典,所以查询字符串中键 - 值对的集合是数据绑定机制的合适数据。
但我仍然需要能够接收null
参数。并且我不允许在路线值中明确地传递null
。我怎么能阻止查询字符串数据绑定发生?
答案 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:避免使用通用集合类型作为操作参数,您可以完全避免这些问题。