Допустим, у меня есть теоретическая структура MVC, которая использует объект ViewData
для передачи данных из контроллера в представление.В моем контроллере, скажем, у меня есть такой код (в псевдокоде):
function GetClientInfo()
{
// grab a bunch of data from the database
var client = Database.GetClient();
var clientOrders = Database.GetClientOrders();
var clientWishList = Database.GetClientWishList();
// set a bunch of variables in the ViewData object
ViewData.set("client", client);
ViewData.set("clientOrders", clientOrders);
ViewData.set("clientWishList", clientWishList);
showView("ClientHomePage");
}
А затем в моем представлении ClientHomePage
я отображаю данные следующим образом:
<p>Welcome back, [ViewData.get("client").FirstName]!</p>
<p>Your order history:</p>
<ul>
[Html.ToList(ViewData.get("clientOrders")]
</ul>
<p>Your wishlist:</p>
<ul>
[Html.ToList(ViewData.get("clientWishList")]
</ul>
Это то, на что я понимаю MVC (пожалуйста, поправьте меня, если я ошибаюсь).Проблема, с которой я столкнулся, заключается в том, что эти волшебные нити в поле зрения.Как представление узнает, какие объекты оно может извлечь из объекта ViewData
, если оно не знает, что контроллер помещает туда в первую очередь?Что если кто-то выполнит рефакторинг одной из магических строк в контроллере, но забудет изменить ее в представлении и получит ошибку времени выполнения вместо ошибки времени компиляции?Это кажется мне довольно серьезным нарушением разделения интересов.
Здесь я думаю, что ViewModel может пригодиться:
class ClientInfo
{
Client client;
List clientOrders;
List clientWishList;
}
Затем контроллер создает экземплярClientInfo
и передает его на просмотр.ViewModel становится обязательным контрактом между контроллером и представлением, и представлению не нужно знать, что делает контроллер, если предполагается, что контроллер заполняет ViewModel должным образом.Сначала я думал, что это MVVM, но читая больше об этом, мне кажется, что я имею в виду больше MVC-VM, поскольку в MVVM контроллер не существует.
Мой вопрос заключается в том, чтоя не понимаю здесь о MVC против MVVM?Неужели обращение к переменным в ViewData
по волшебным строкам не так уж плохо?И как можно гарантировать, что изменения, внесенные в контроллер, не окажут отрицательного влияния на представление?