Я бы использовал отдельные модели просмотра для деталей (просмотр только для чтения), создания и редактирования.
Самый простой способ повторно использовать код/представления, которые повторяются в проекте, — использовать частичные представления. Поэтому, если на странице есть повторяющийся аспект, во что бы то ни стало используйте частичное представление и включите его в несколько разных представлений.
Что касается создания/обновления или просмотра сведений, IMO проще использовать отдельный тип представления для этих отдельных представлений. Понятно, что код должен быть модульным и не иметь повторяющегося кода, но наступает момент, когда сложность в попытке достичь максимальной модульности может перевесить повторение некоторых полей в форме.
Представление для «Создания» будет представлять пустую форму, поэтому вы не получаете никаких значений из базы данных или повторно используете данные как таковые, а добавляете данные в базу данных. Таким образом, повторное использование одного и того же представления для этого ограничено.
Представление создания передаст детали в форму с полями для создания нового объекта.
Представление редактирования передаст идентификатор этого объекта для заполнения полей формы, и это вместе с идентификатором будет передано контроллеру.
Представление сведений будет передавать идентификатор этого объекта для заполнения полей таблицы (возможно) и не требует сбора формы.
Таким образом, хотя 1 и 2, две формы, имеют общие поля, существует проблема управления тем, где идентификатор должен быть передан в эту форму, и как и когда это определяется в потоке вашей программы.
Несмотря на то, что между 2 и 3 есть общие данные, представление представления совершенно другое, форма, скажем, таблица, и любые поля формы должны быть сделаны только для чтения, чтобы форма редактирования имитировала отображение представления сведений.
Проблема между повторным использованием представления для отображения сведений только для чтения и редактированием объекта заключается в том, что вам потребуется реализовать более сложный способ отключения полей только для чтения. Если вы не возражаете против дисплея, показывающего редактируемые поля (не лучший UX imo).
Таким образом, не требуя передачи некоторых данных в представление для изменения способа отображения этих представлений, имеет смысл иметь отдельные отображения для каждого из них. Я думаю, что это обеспечило бы менее сложный подход и позволило бы иметь меньше ошибок кодирования и проблем с безопасностью, которые могут возникнуть из-за использования переменных ViewBag или javascript, например, чтобы сделать редактируемые поля доступными только для чтения, изменяя представление одной страницы просмотра.
Еще одно примечание: для сброса пароля (который потенциально является редактированием пользователем) я всегда реализую это отдельно, что придает вес вашей идее совместного использования представлений и представления данных, однако представление данных достаточно различается, чтобы гарантировать разные представления.
Сказав это, я работал над приложением, которое доступно только для чтения для некоторых пользователей в зависимости от роли аутентификации. Как уже упоминалось, это потребовало тщательной обработки на стороне сервера и клиента проекта, чтобы гарантировать, что неавторизованные пользователи не смогут редактировать или удалять какие-либо представления только для чтения (в данном случае это было проще, чем репликация представлений). В общем случае я бы рекомендовал отдельные представления для отдельных функций. Таким образом, код адаптирован для взаимодействия с этим представлением (или частичным представлением) для определенной цели.
person
Community
schedule
27.08.2016
class UserBaseVM
содержит свойства, общие для всех представлений (например,Email
), а затем создаю модель представления для каждого представления, наследуемого отUserBaseVM
, например,class UserCreateVM : UserBaseVM
будет содержать свойства, относящиеся к созданию нового пользователя (например,ConfirmPassword
) - person   schedule 27.08.2016var model = db.Users.Select(x => new UserVM() { Email = x.Email, ..... });
для вызова базы данных и проецирования данных в модель представления, прежде чем возвращать их в представление (или использовать такие инструменты, как автосопоставитель - person   schedule 27.08.2016