I chose a different approach, which I named "EditModel". It is neither a binding nor a view model, something for both, depending if we view or bind.
The idea:
The EditModel has the Model attached to it but also provides additional data, such as the dictionary which you can use in the dropdown.
Imagine this:
public class Teacher {
public int Id { get; set; }
public int SchoolId { get; set; }
public School School { get; set; } = new();
public string Name { get; set; } = "";
}
public class TeacherEditModel {
public Teacher Item { get; set; }
public Dictionary<int, string> Schools { get; set; }
}
In the View I use the edit model but I bind its item only.
And then bind to the item, such as
TryUpdateModel<Teacher>(model, "Item")
And in the controller, you will fill the dictionary in some method like PopulateDropDowns.
Advantage is, you do not use the ViewBag and you don't duplicate code.
I hope you got the idea.