Вот что я бы порекомендовал вам: используйте модели представлений и отбросьте эти интерфейсы, не загромождая ваши контроллеры таким большим количеством кода. Таким образом, вам не нужно связывать зарплату в этом конкретном действии: отлично, используйте специально настроенную модель представления для этого представления:
public class PersonViewModel
{
public string Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
И ваш контроллер действия:
public ActionResult Save(PersonViewModel person)
{
_repository.SavePersonToDatabase(person);
return RedirectToAction("Browse");
// Notice how I've explicitly dropped the try/catch,
// you weren't doing anything meaningful with the exception anyways.
// I would simply leave the exception propagate. If there's
// a problem with the database it would be better to redirect
// the user to a 500.htm page telling him that something went wrong.
}
Если в другом действии вам нужна зарплата, напишите другую модель представления, специфичную для этого представления. Не беспокойтесь, если вы повторите некоторые свойства между вашими моделями представления. Это именно то, для чего они предназначены. Очевидно, ваш репозиторий будет работать с моделью, а не с моделью. Так что вам нужно будет сопоставить эти два типа. Я бы порекомендовал вам использовать AutoMapper для этой цели.
Это моя точка зрения: всегда пишите модели представлений, специально адаптированные к потребностям данного представления. Старайтесь избегать таких параметров, как «Включить», «Исключить», иначе однажды вас укусят, кто-то собирается добавить какое-либо конфиденциальное свойство и забудет добавить его в список «Исключить». И даже если вы использовали функцию «Включить», она по-прежнему ужасна.