C# 如何处理“警告类型“”上的MVC1004属性与参数“”同名”?
我试图在查询字符串参数上添加一些验证逻辑,但在这个警告上遇到了障碍 警告:类型“CountryCode”上的MVC1004属性与参数“CountryCode”同名。这可能导致不正确的模型绑定。请考虑重命名该参数或使用模型绑定属性来重写该名称。 关于 结果:模型绑定失败 让我给你看看这个案例: 基本上,我尝试将验证逻辑应用于HttpGet查询字符串参数,该参数的简单类型是string 因此,我最初的想法是将参数包装在一个类中,并添加一些隐式转换,使其易于使用 类型是CountryCode,如前所述,简单的底层类型是string 我们的想法是这样称呼它: 以下是国家代码:C# 如何处理“警告类型“”上的MVC1004属性与参数“”同名”?,c#,.net,asp.net-core,model-binding,C#,.net,Asp.net Core,Model Binding,我试图在查询字符串参数上添加一些验证逻辑,但在这个警告上遇到了障碍 警告:类型“CountryCode”上的MVC1004属性与参数“CountryCode”同名。这可能导致不正确的模型绑定。请考虑重命名该参数或使用模型绑定属性来重写该名称。 关于 结果:模型绑定失败 让我给你看看这个案例: 基本上,我尝试将验证逻辑应用于HttpGet查询字符串参数,该参数的简单类型是string 因此,我最初的想法是将参数包装在一个类中,并添加一些隐式转换,使其易于使用 类型是CountryCode,如前所述
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; }
一切正常
现在,我的目标是使用countryCode以及查询字符串参数名和C方法参数名,保持属性验证并保持对字符串的隐式转换
有办法吗
我试过几件事:
摆弄名字
尝试使用[BindAttribute]、[FromQuery]、[ModelBinderAttribute]
将值重命名为实际名称
在国家代码中使用了snake_案例,它可以工作,但不会帮助我处理像day这样的属性,我尝试使用它作为模式
一个定制的模型活页夹我希望我不需要
更多
但我没有用。您能帮助我吗?因为您已经通过FromQuery绑定了属性,所以参数名不需要是countryCode。这就是导致绑定冲突的原因 正如您已经看到的,更改操作中使用的参数的名称就足够了
public IActionResult Get(CountryCode model) {
if (!ModelState.IsValid)
return BadRequest("list errors");
//logic here
return Ok();
}
模型中的[FromQueryName=countryCode]将由模型绑定器拾取,并且您的模型将由设计填充。是的,事情是这样的;我希望其他人也能适应这种模式。因此,理想情况下,action methods参数的名称不应中断,特别是因为它是最自然的名称。