避免使用Dictionary从被绑定到所有查询字符串参数

本文关键字:绑定 参数 字符串 查询 Dictionary string | 更新日期: 2023-09-27 18:12:27

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

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

我理解它的方式,MVC框架试图将参数绑定到查询字符串,因为它是一个带有字符串键的字典,查询字符串中的键值对的集合是适合数据绑定机制的数据。

但是无论如何我需要能够接收null参数。我也不允许在路由值中显式地传递null。如何防止查询字符串数据绑定的发生?

避免使用Dictionary<string, T>从被绑定到所有查询字符串参数

与其将模型参数定义为Dictionary,不如创建一个需要更显式绑定的模型

之类的
 ModelClass { 
    string SomeName {get;set;} 
    T Internal {get;set;}
}
public ActionResult YourAction(ModelClass boundInstance){}

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

其他选项-如果你只打算从一个帖子中获取Dictionary数据,你可以添加属性[FromBody]到绑定

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

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