Какую роль играет MVVM ASP.NET веб-приложения MVC 4?

пока я читаю книгу "ASP.NET MVC 4" Мне интересно о MVVM. Я начал гуглить и не могу найти книг о разработке веб-приложений с помощью MVVM, поэтому я должен пропустить немного информации здесь.

из того, что я понимаю, MVVM используется в веб-приложениях на стороне клиента через нокаут.js и другие рамки. Если бы, однако, я должен был разработать приложение Windows Phone, я мог бы использовать MVVM напрямую без использования MVC. Означает ли это, что концепция MVVM / data привязка просто не применяется к клиент-серверным веб-приложениям?

4 ответов


MVVM действительно своего рода подшаблон. На самом деле нет никаких фреймворков веб-приложений "MVVM". Они все MVC, и вы в значительной степени просто включаете модель представления, если хотите.

С ASP.NET MVC, в частности, вы просто создаете класс, обычно с именем в виде [Model Name]ViewModel или [Model Name]VM. Этот класс будет иметь только свойства из вашей модели, с которыми вам нужно будет работать, и все, что не имеет смысла помещать в вашу фактическую базу данных модель, как SelectLists, etc.

в вашем действии вы просто передаете экземпляр этой модели представления в свой вид вместо своей модели:

return View(viewModelInstance);

и, конечно же, убедитесь, что ваш взгляд принимает это:

@model Namespace.To.MyViewModel

единственная немного сложная часть-это подключение модели представления к модели (т. е. получение данных в/из модели представления/модели. Вы можете сделать это вручную, явно сопоставив свойства, или вы можете использовать что - то вроде AutoMapper.


MVC-это односторонняя система привязки данных.

заполнить ваш Mмодели Controller, затем передайте его View.


MVVM-это двусторонняя привязка данных.

заполнить ваш Model, используйте его в View, когда Vизменения состояния iew, ваш Mобновление odel автоматически.(Наоборот)


MVVM является стандартным шаблоном проектирования для разработки WPF / Silverlight и не следует путать с MVC для ASP.Net развитие.

эти два могут звучать одинаково и разделяют некоторые общие части, но они являются двумя различными шаблонами дизайна.

из того, что я узнал о Knockout.js, он был разработан для создания "Привязок данных", подобных тому, что вы использовали бы в разработке WPF/Silverlight, поэтому там применяется шаблон проектирования MVVM.

цитировать от другого ответ моего относительно различий между MVVM и MVC

на MVVM код классов (ViewModels) ваше приложение, в то время как ваш Views просто довольно удобный интерфейс, который сидит на верхней части кода приложения и позволяет пользователям взаимодействовать с ним. Это означает ViewModels имейте огромную работу, потому что они ваше приложение и несут ответственность за все, от потока приложений до бизнеса логика.

С MVC ваш Views ваше приложение, в то время как ваш Controller обрабатывает поток приложения. Логика приложения обычно находится в ViewModels, которые считаются частью M в MVC (sidenote: M в MVC нельзя рассматривать так же, как M в MVVM, потому что M-слой MVC содержит больше функциональности, чем M-слой MVVM). Пользователю предоставляется экран (View), они взаимодействуют с ним, а затем представляют что-то Controller и Controller решает кто что делает с данными и возвращает пользователю новое представление.


означает ли это, что концепция привязки MVVM / data просто не применяется к веб-приложениям клиент-сервер?

Нет, ты can применить шаблон MVVM к веб-приложениям клиент-сервер.

фактически Asp.Net MVC фактически использует этот шаблон - когда контроллер создает представление, он может пройти в "view-model". Эта модель представления часто является объектом данных POCO со всеми данными, которые нужны конкретному представлению, взятыми из модели (база данных.) Представление использует эти данные для отображения HTML-страницы.

MVVM в Википедии говорит, что он был представлен Microsoft с WPF. В частности, представление привязывается к свойствам модели представления. Затем модель представления сопоставляет это с базой данных. По этому определению, Asp.Net не совсем соответствует этому. Клиентские фреймворки, такие как нокаут.js и vue.js поддерживает этот вид двухсторонней привязки со свойствами модели представления.

все эти шаблоны основаны на фантастическом MV* узор. Первоначально он назывался шаблоном проектирования MVC. Так это точно такая же картина как Asp.Net тогда MVC? Вообще-то, не совсем. Контроллер означает что-то совершенно другое для начала (см. MVC в Википедии). Оригинальный контроллер MVC обрабатывает весь пользовательский ввод напрямую, а не через представление. Во-вторых, оригинальный шаблон MVC был разработан для графического интерфейса настольного приложения и Asp.Net MVC адаптировал шаблон для использования в клиент-серверном веб-приложении. Контроллер ASP.NET коллекция http-конечные точки, на которые может попасть клиентская html-страница (например, form-post, Page-navigation, ajax).

таким образом, существует много шаблонов M-something-V, и общий шаблон часто называют шаблоном дизайна MVC.

есть еще одна важная морщина: клиентская сторона против серверной. Мы представили богатые клиентские JavaScript-фреймворки, и фантастический шаблон MV* здесь тоже великолепен. Итак, теперь у нас может быть что-то вроде: вид на стороне клиента-модель-ServerHTTPEndPoints и серверные ServerHTTPEndPoints-ServerModel. Сервер-конечные точки ссылаются на Asp.Net контроллеры или эквивалент в любом веб-фреймворке или языке программирования, который вы используете. С точки зрения сервера, весь клиентский html является представлением. Клиентская модель взаимодействует с API сервера ajax (конечные точки http) для синхронизации данных или запуска дополнительных действий. ServerModel обычно является базой данных. В knockout / vue вместо клиентской "модели" это будет ViewModel. Если вы используете react/vue с redux / flux тогда клиентская сторона будет View-ViewModel-Model-ServerHTTPEndPoints, где модель будет хранилищами redux/flux. Кроме того, часто на стороне сервера вводится служба: ServerHTTPEndPoints-Service-Model. Таким образом, модульные тесты могут напрямую попасть в службу, а не запускать весь веб-сервер и устанавливать HTTP-соединения.