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.