In my form
, I have a DropDownList
in which I am populating the data from table Locations
from my Database
. When the user selects the LocationName
, the corresponding LocationId
should get saved into the ViewModel
so that I can pass it to the POST
method to save the data into the Database
. But, instead of getting the corresponding LocationId
, I am getting 0
.
Upon searching for the cause, I find that as ListItem
needs the value
and text
fields in the form of string
, while saving the data, I am forced to convert the LocationId
into string
using .ToString()
. How can I get the LocationId
to be stored into the ViewModel
?
Code Snippets:
Controller
public IActionResult Locate(int Id)
{
InventoryLocationsHistoryViewModel locationsHistoryVM = new InventoryLocationsHistoryViewModel();
// Populating Locations DropDownList
var locationsList = new List<InventoryLocations>();
locationsList = _context.InventoryLocations.ToList();
var locations = locationsList.OrderBy(l => l.LocationName).Select(us => new SelectListItem { Value = us.LocationId.ToString(), Text = us.LocationName }).ToList();
ViewBag.Locations = locations;
return View(locationsHistoryVM);
}
View
<label asp-for="LocationId" class="fg-labels" for="locationName"></label>
<select asp-for="LocationId" asp-items="ViewBag.Locations" class="chosen disabledropdowncntrl" data-placeholder="Choose a Location" name="locationName" id="dropDownLocationNames">
<option value=""></option>
</select>
ViewModel
public int LocationId { get; set; }
public InventoryLocations Location { get; set; }
What to do?
When the form is posted, the parameters are named after name
values of the inputs. So what is currently posted is locationName=5
, because you have this in the select:
name="locationName"
Looks like you need to change this to
name="locationId"
to match the parameter name in the view model.
And don't worry about string vs int, model binding should be able to figure it out.