Does anyone know why I'm getting always a false value when I update the form? I tried with (value="false") into the checkbox but still doesn't work. Any help is appreciated!
<form asp-controller="Weather" asp-action="Update" method="POST">
<tr>
<td>@city.City</td>
<td><input type="number" name="cityId" value="@city.Id" hidden/></td>
<td><input type="checkbox" asp-for="@city.OnHeader" /></td>
<td><input type="checkbox" asp-for="@city.OnProfile" /></td>
<td><a asp-controller="Weather" asp-action="Delete" asp-route-cityId="@city.Id"><i class="fas fa-trash-alt color"></i></a></td>
<td><button type="submit"><i class="fas fa-edit color"></i></button></td>
</tr>
</form>
[HttpPost]
public IActionResult Update(WeatherModel theWeather, int cityId)
{
_weatherService.Update(cityId, theWeather.OnHeader, theWeather.OnProfile);
return RedirectToAction("Settings");
}
CodePudding user response:
WeatherController's Update API expects that will receive theWeather and cityId parameters. The expected receive data is as below:
{
"theWeather": {
"onHeader": `<boolean value>`,
"onProfile": `<boolean value>`
},
"cityId": `<numeric value>`
}
While you submit the form for Update, you are sending data to API as below:
{
"city": {
"onHeader": `<boolean value>`,
"onProfile": `<boolean value>`
},
"cityId": `<numeric value>`
}
Hence, theWeather.onHeader and theWeather.onProfile will get the default boolean value (false) as theWeather value is not received from front-end.
Solutions
Solution 1: Apply name attribute for <input> elements aimed for model binding
- Will submit the form with data includes
theWeatherobject to API.
<td><input type="checkbox" name="theWeather.OnHeader" asp-for="@city.OnHeader" /></td>
<td><input type="checkbox" name="theWeather.OnProfile" asp-for="@city.OnProfile" /></td>
Solution 2: Rename Update theWeather parameter to city
- Ensure that the
cityparameter is matched with the HTML form.
public IActionResult Update(WeatherModel city, int cityId)
{
_weatherService.Update(cityId, city.OnHeader, city.OnProfile);
return RedirectToAction("Settings");
}
Solution 3: Use [Bind(Prefix = "city")] attribute
- Model binding will looking through the sources for the key
cityinstead oftheWeather.
public IActionResult Update(([Bind(Prefix = "city")] WeatherModel theWeather, int cityId)
