As @Stefan says, the @itm is a complex type, we couldn't pass it to the controller directly in the select option value.
If you still want to pass the item based on the select option, I suggest you could try set some custom attribute for the select option with the CatalogItem property and add come hidden field on the view and the hidden input's name is the CatalogItem property name.
Then you could use jquery to set the input hidden's value according to the dropdownlist select option.
The asp.net core model binding will bind the model according to the formdata's name, so it will bind well.
More details, you could refer to below example.
CatalogItem model:
public class CatalogItem
{
public int Id { get; set; }
public string Description { get; set; }
public string Name { get; set; }
}
View:
<form asp-action="DropdownGetValue" id="test1">
<select id="itmSelect" name="Id">
@foreach (var itm in Model)
{
<option class="text-dark" value="@itm.Id" Description="@itm.Description" Name="@itm.Name">@itm.Description</option>
}
</select>
<input type="hidden" name="Description" id="Description" />
<input type="hidden" name="Name" id="Name" />
<input type="submit" value="Click" />
</form>
Jquery script:
<script type="text/javascript">
$(function () {
$("#itmSelect").change(function () {
$("#Description").val($('#itmSelect').find(":selected").attr("Description"));
$("#Name").val($('#itmSelect').find(":selected").attr("Name"));
});
})
</script>
Controller:
[HttpPost]
public IActionResult DropdownGetValue(CatalogItem itmSelect)
{
//_db.Category.Add(ca);
//_db.SaveChanges();
int i = 0;
return Ok();
}
Result:

null?