This is how it works. What you have on POST action is what parameters were posted on the form. For instance the drop down will post a single number (or string) representing selected value (0, 5, 20). So basically instead of
public IEnumerable<SelectListItem> selectedVatRate { get; set; }
you need
public int selectedVatRate { get; set; }
for this to be handled correctly. Then on post selectedVatRate
will contain the selected value as an integer (for example 5 in user selected 5% option).
Side note. You have the same value for default list item and for the first option of 0%. This does not look right, as you won't be able to tell one from the other on post. So you might want default value to be empty:
Text = "Please select...", Value = ""
and turn the selectedVatRate
field to int?
. Then on post you will get null
if default option is selected, and 0 in case of 0%.