c# - 如何处理“类型''上的警告MVC1004属性与参数'同名”?
问题描述
我正在尝试在查询字符串参数上添加一些验证逻辑,但一直遇到此警告。
警告 MVC1004 类型“CountryCode”的属性与参数“countrycode”同名。这可能会导致不正确的模型绑定。请考虑重命名参数或使用模型绑定属性来覆盖名称。
参考微软文档
结果:模型绑定失败。
让我给你看一个案例:
基本上我正在尝试将验证逻辑应用于HttpGet
查询字符串参数,它的简单类型是string
.
所以,我最初的想法是将参数包装在一个类中,并添加一些隐式转换以使其易于使用。
类型是 a CountryCode
,如前所述,简单的基础类型是string
。
我们的想法是这样称呼它:
这是国家代码:
public class CountryCode
{
[FromQuery(Name = "countryCode")]
[Required]
[RegularExpression("^[A-Z]{2}$")]
public string Value { get; set; }
public static implicit operator string(CountryCode countryCode)
{
return countryCode.Value;
}
public static implicit operator CountryCode(string countryCode)
{
return new CountryCode()
{
Value = countryCode
};
}
}
因此,下一步是在控制器中使用它:
public IActionResult Get(CountryCode countryCode)
{
if (!ModelState.IsValid)
return BadRequest("list errors");
//logic here
return Ok();
}
实际上这看起来很有希望,如果不是因为弹出警告并且实际绑定没有成功导致null
for 值。
但,
然后,如果我更改操作中使用的参数名称:
public IActionResult Get(CountryCode foo)
或更改FromQuery
属性中的名称:
[FromQuery(Name = "foo")]
public string Value { get; set; }
一切正常。
现在,我的目标是使用countryCode
查询字符串参数名称以及 C# 方法参数名称,保持属性验证并保持隐式转换为字符串。
有没有办法做到这一点?
我尝试了几件事:
- 摆弄名字
- 尝试使用
[BindAttribute]
,[FromQuery]
,[ModelBinderAttribute]
- 重命名
Value
为实际名称 - 使用了
snake_case
forcountry_code
(它有效),但不会帮助我处理类似的属性day
(我正在尝试将其用作模式) - 一个自定义模型绑定器(我希望我不需要)
- 多一点
但我没有用。你能帮助我吗?
解决方案
因为您已经通过绑定属性,FromQuery
所以参数名称不需要是countryCode
. 这就是导致绑定冲突的原因。
正如您已经看到的那样,更改操作中使用的参数的名称就足够了
public IActionResult Get(CountryCode model) {
if (!ModelState.IsValid)
return BadRequest("list errors");
//logic here
return Ok();
}
模型中的[FromQuery(Name = "countryCode")]
将被模型绑定器拾取,并且您的模型将按设计填充。
推荐阅读
- ios - 如果变量具有特定值,则隐藏 UIButton?
- swift - 来自带有@objc 的 unreconized 选择器的实例错误
- php - 是否可以链接到 Timber 模板中的其他静态页面?
- python - 函数不会返回值
- wordpress - 在相关产品列表中显示自定义属性“可变产品”
- vba - 使用类似于“集合”的数据类型“范围” - VBA
- reactjs - 从父组件的状态传递子组件中的道具
- rxjs - 在 redux-observable 史诗中,为什么我们可以过滤一种类型的动作流,但仍然可以访问另一种类型的动作流
- gnuplot - 如何从多个来源绘制图表?
- python - read_csv 中的引用参数