Как бороться с "Предупреждение MVC1004 Свойство типа" имеет то же имя, что и параметр ""? - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь добавить логику проверки для параметра строки запроса, но продолжаю спотыкаться об этом предупреждении.

Предупреждение MVC1004 Свойство типа CountryCode имеет то же имя, что и параметр countrycode. Это может привести к неправильной привязке модели. Рассмотрите переименование параметра или использование атрибута привязки модели для переопределения имени.

Со ссылкой на документы Microsoft

В результате: привязка модели не удалась.


Позвольте мне показать вам случай:

Обычно я пытаюсь применить логику проверки к параметру строки запроса HttpGet, простой тип которого string.

Итак, моя первоначальная мысль заключалась в том, чтобы обернуть параметр в классе и добавить некоторые неявные преобразования, чтобы его было легко использовать.

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

На самом деле это выглядело очень многообещающе, если бы не всплыло предупреждение, а фактическая привязка не удалась, что привело к null для значения.


Но

затем, если я изменю имя параметра, используемого в действии:

public IActionResult Get(CountryCode foo)

или изменить имя в атрибуте FromQuery:

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

Все отлично работает.


Теперь моя цель - использовать countryCode, а также имя параметра строки запроса и имя параметра метода C #, сохранить проверку атрибута и неявное приведение к строке.

Есть ли способ сделать это?

Я попробовал пару вещей:

  • возился с именами
  • пытался использовать [BindAttribute], [FromQuery], [ModelBinderAttribute]
  • переименован Value в реальное имя
  • использовал snake_case для country_code (это работает), но не поможет мне с такими свойствами, как day (я пытаюсь использовать это как шаблон)
  • пользовательское связующее (надеюсь, мне не нужно)
  • еще немного

но я не помог. Вы можете мне помочь?

1 Ответ

0 голосов
/ 18 июня 2019

Поскольку вы уже привязываете свойство через FromQuery, нет необходимости указывать имя параметра countryCode.Именно это вызывает конфликт привязки.

достаточно изменить имя параметра, используемого в действии, как вы уже видели

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

[FromQuery(Name = "countryCode")] в модели будетподобрано подобрано модельным переплетом, и ваша модель будет заполнена дизайном.

...