我正在尝试在查询字符串参数上添加一些验证逻辑,但始终在此警告上绊脚石。
警告MVC1004类型“ CountryCode”的属性与参数“ countrycode”具有相同的名称。这可能会导致错误的模型绑定。请考虑重命名参数或使用模型绑定属性来覆盖名称。
结果:模型绑定失败。
基本上,我正在尝试将验证逻辑应用于一个简单类型为HttpGet
的{{1}}查询字符串参数。
因此,我最初的想法是将参数包装在一个类中,并添加一些隐式转换以使其易于使用。
类型是string
,并且如上所述,简单的基础类型是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
或在public IActionResult Get(CountryCode foo)
属性中更改名称:
FromQuery
一切正常。
现在,我的目标是使用[FromQuery(Name = "foo")]
public string Value { get; set; }
以及查询字符串参数名称和C#方法参数名称,保持属性验证并将隐式强制转换为字符串。
有办法吗?
我尝试了几件事:
countryCode
,[BindAttribute]
,[FromQuery]
[ModelBinderAttribute]
重命名为实际名称Value
使用了snake_case
(有效),但对country_code
这样的属性没有帮助(我正在尝试将其用作模式)但是我没有用。你能帮我吗?
答案 0 :(得分:0)
因为您已经通过FromQuery
绑定了属性,所以不需要将参数名设置为countryCode
。这就是造成绑定冲突的原因。
更改动作中使用的参数名称就足够了
public IActionResult Get(CountryCode model) {
if (!ModelState.IsValid)
return BadRequest("list errors");
//logic here
return Ok();
}
模型中的[FromQuery(Name = "countryCode")]
将由模型绑定器拾取,并且您的模型将通过设计填充。