首页 > 解决方案 > 如何处理“类型''上的警告MVC1004属性与参数'同名”?

问题描述

我正在尝试在查询字符串参数上添加一些验证逻辑,但一直遇到此警告。

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

参考微软文档

结果:模型绑定失败。


让我给你看一个案例:

基本上我正在尝试将验证逻辑应用于HttpGet查询字符串参数,它的简单类型是string.

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

类型是 a CountryCode,如前所述,简单的基础类型是string

我们的想法是这样称呼它:

http://example.org?countryCode=EU

这是国家代码:

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();
}

实际上这看起来很有希望,如果不是因为弹出警告并且实际绑定没有成功导致nullfor 值。


但,

然后,如果我更改操作中使用的参数名称:

public IActionResult Get(CountryCode foo)

更改FromQuery属性中的名称:

[FromQuery(Name = "foo")]
public string Value { get; set; }

一切正常。


现在,我的目标是使用countryCode查询字符串参数名称以及 C# 方法参数名称,保持属性验证并保持隐式转换为字符串。

有没有办法做到这一点?

我尝试了几件事:

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

标签: c#.netasp.net-coremodel-binding

解决方案


因为您已经通过绑定属性,FromQuery所以参数名称不需要是countryCode. 这就是导致绑定冲突的原因。

正如您已经看到的那样,更改操作中使用的参数的名称就足够了

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

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


推荐阅读