如何处理“警告类型为”的MVC1004属性与参数“”具有相同的名称?

时间:2019-06-17 23:23:23

标签: c# asp.net-core model-binding

我正在尝试在查询字符串参数上添加一些验证逻辑,但始终在此警告上绊脚石。

  

警告MVC1004类型“ CountryCode”的属性与参数“ countrycode”具有相同的名称。这可能会导致错误的模型绑定。请考虑重命名参数或使用模型绑定属性来覆盖名称。

参考microsoft docs

结果:模型绑定失败。


让我告诉你情况:

基本上,我正在尝试将验证逻辑应用于一个简单类型为HttpGet的{​​{1}}查询字符串参数。

因此,我最初的想法是将参数包装在一个类中,并添加一些隐式转换以使其易于使用。

类型是string,并且如上所述,简单的基础类型是CountryCode

想法是这样称呼它:

  

http://example.org?countryCode=EU

这是国家/地区代码:

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这样的属性没有帮助(我正在尝试将其用作模式)
  • 自定义模型活页夹(我希望我不需要)
  • 更多

但是我没有用。你能帮我吗?

1 个答案:

答案 0 :(得分:0)

因为您已经通过FromQuery绑定了属性,所以不需要将参数名设置为countryCode。这就是造成绑定冲突的原因。

更改动作中使用的参数名称就足够了

public IActionResult Get(CountryCode model) {
    if (!ModelState.IsValid)
        return BadRequest("list errors");
    //logic here
    return Ok();
}

模型中的[FromQuery(Name = "countryCode")]将由模型绑定器拾取,并且您的模型将通过设计填充。