MVC1004: Rename model bound parameter

Value
Rule ID MVC1004
Fix is breaking or non-breaking Breaking

Cause

A model bound parameter has the same name as one of its properties.

Rule description

Model binding a complex parameter with a property that has the same name may result in unexpected binding behavior. Consider renaming the parameter, or using a binding attribute to specify a different name.

Consider the following code:

public class HomeController : Controller
{
    public IActionResult Get(SearchModel search)
    {
        ...
    }
}

public class SearcModel
{
    public string Search { get; set; }
}

In this model, the parameter and its property are both named Search, which results in model binding attempting to bind the property as search.Search. Naming a parameter and its property the same prevents binding to a value without a prefix such as a query that looks like ?search=MySearchTerm.

How to fix violations

  • Rename the parameter if its prefix is not used during binding:
public IActionResult Get(SearchModel model)
{
    ...
}

Renaming a parameter on a public type could be considered a breaking change since it changes a library's public API surface.

  • If this is problematic, consider using a model binding attribute such as Bind to specify the model binding prefix:
public IActionResult Get([Bind(Prefix = "")] SearchModel search)
{
    ...
}

When to suppress warnings

Warnings can be suppressed if you intend to use the parameter name as a prefix during model binding.