Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理“警告类型“”上的MVC1004属性与参数“”同名”?_C#_.net_Asp.net Core_Model Binding - Fatal编程技术网

C# 如何处理“警告类型“”上的MVC1004属性与参数“”同名”?

C# 如何处理“警告类型“”上的MVC1004属性与参数“”同名”?,c#,.net,asp.net-core,model-binding,C#,.net,Asp.net Core,Model Binding,我试图在查询字符串参数上添加一些验证逻辑,但在这个警告上遇到了障碍 警告:类型“CountryCode”上的MVC1004属性与参数“CountryCode”同名。这可能导致不正确的模型绑定。请考虑重命名该参数或使用模型绑定属性来重写该名称。 关于 结果:模型绑定失败 让我给你看看这个案例: 基本上,我尝试将验证逻辑应用于HttpGet查询字符串参数,该参数的简单类型是string 因此,我最初的想法是将参数包装在一个类中,并添加一些隐式转换,使其易于使用 类型是CountryCode,如前所述

我试图在查询字符串参数上添加一些验证逻辑,但在这个警告上遇到了障碍

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

关于

结果:模型绑定失败

让我给你看看这个案例: 基本上,我尝试将验证逻辑应用于HttpGet查询字符串参数,该参数的简单类型是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; }
一切正常

现在,我的目标是使用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参数的名称不应中断,特别是因为它是最自然的名称。