Есть ли причина, по которой я бы использовал Knockout MVC вместо Knockout JS?

Другой пользователь предложил Knockout MVC для решения некоторых проблем с публикацией AJAX. Я немного почитал об этом и вижу, что это оболочка вокруг Knockout JS. Так что мне интересно, каковы реальные различия между ними? Должен ли я возиться с Knockout JS, поскольку Knockout MVC существует? Когда бы я использовал один над другим?


person dotnetN00b    schedule 23.07.2012    source источник


Ответы (12)


Knockout MVC — незаконнорожденный ребенок WebForms. Он направляет все методы модели представления через действия контроллера, а это означает, что все, что происходит, должно возвращаться на сервер и обратно. Я не могу понять, почему кто-то может взять такую ​​​​инфраструктуру, как нокаут, которая предназначена для MVVM на стороне КЛИЕНТА, и заставить ее вызывать сервер для каждой функции.

Кроме того, выполнение этих методов на сервере означает, что вся модель представления должна передаваться на сервер и обратно клиенту при каждом вызове функции. Это невероятно расточительно.

Использование Knockout MVC означает отказ от всех преимуществ производительности клиентского кода в пользу отсутствия необходимости писать javascript. Тот же самый компромисс сделали WebForms. Это не очень хорошо. Это антипаттерн.

Если Knockout MVC умрет завтра, Интернет станет лучше.

person Kyeotic    schedule 23.07.2012
comment
Я предполагаю, что это было написано, чтобы повысить популярность KO для людей, которые более опытны в C # и ASP.NET (обе хорошие технологии, которые я тоже люблю). Однако я согласен с тем, что не вижу веских причин использовать KO MVC вместо KO. Одним из основных моментов KO является богатый клиент и низкий сетевой чат. - person John Papa; 24.07.2012
comment
@JohnPapa Мне нравились C# и ASP (MVC) до того, как я изучил Knockout. Нежелание изучать новые технологии и новые приемы — плохая позиция в нашей отрасли. Особенно, когда это заставляет вас использовать методы, которые неэффективны. Если вы хотите разрабатывать веб-приложения, изучение javascript ОБЯЗАТЕЛЬНО! - person Kyeotic; 24.07.2012
comment
эй, tyrsius, не превращая это в «чат», каковы ваши показатели сейчас по логике нокаута и серверной части. я использовал нокаут только для «сохранения» привязок на стороне клиента, ничего кроме этого не делал. хотелось бы увидеть несколько ссылок на демонстрацию более богатого использования между asp.net mvc и клиентом - person jim tollan; 24.07.2012
comment
Я думаю, это станет болтливым. Моя электронная почта находится в моем профиле, не стесняйтесь обращаться ко мне с любыми вопросами. - person Kyeotic; 24.07.2012
comment
-1 от меня. Что бы вы ни сказали, это правильно, но есть еще одно место, где я хочу работать над моделью, не отправляя данные на сервер и обратно. - person crypted; 24.12.2012
comment
@ Int3ὰ Это моя точка зрения. Knockout MVC отправляет модель на сервер и обратно. Нокаут этого не делает. Почему вы минусуете меня за поведение фреймворка, о котором я вас точно предупреждаю? - person Kyeotic; 24.12.2012
comment
@Tyrsius, это один момент, о котором я уже сказал, что ты прав. Тем не менее, есть и другие приятные мелочи. - person crypted; 25.12.2012
comment
Я думаю, что важно иметь в виду, что есть подходящее использование, которое усиливает это поведение. Например, одностраничное приложение с кнопкой «Добавить/Редактировать/Сохранить» требует обращения к серверу. В традиционном посте вы отправляете форму и получаете обратно весь визуализированный HTML. С Knockout MVC вам нужно отображать только json при возврате, а не всю страницу. Подход AJAX потребует, чтобы вы сами написали код JS и контроллера. Таким образом, в этом сценарии Knockout избавляет вас от дублирования JS и работает лучше, чем традиционный. Как и все, что можно использовать или злоупотреблять. - person AaronLS; 23.01.2013
comment
@AaronLS Да, но эта поездка добавления/редактирования/сохранения приведет только к отправке всей модели представления в финальном действии. В KnockoutMVC любое действие (например, проверка или добавление в типизированный массив) потребует отправки всей модели представления. Это означает, что каждое действие, которое Knockout обычно обрабатывает на клиенте, быстро будет обработано сервером, что будет скрыто. Если вас не волнует производительность, то да, вы можете написать меньше кода. Но это плохой компромисс. Если вы хотите писать быстрые и производительные веб-приложения, вам потребуется написать javascript и клиентский код. - person Kyeotic; 23.01.2013
comment
@Tyrsius Да, я согласен. Вот что я имею в виду под тем, как вы его используете. Я не уверен, есть ли способ использовать нокаут, но не использовать его проверку, а вместо этого выполнять проверку старым способом написания собственного JS. Помимо этого, моя главная мысль заключается в том, что вы НЕ будете создавать функции в KnockoutMVC, которые вы будете выполнять только на стороне клиента. Свойства там лучше, потому что они становятся JS на стороне клиента. Я согласен, что это один из тех фреймворков, с которыми можно легко выстрелить себе в ногу. - person AaronLS; 24.01.2013
comment
@AaronLS Вы рекомендуете иметь половину кода модели представления на клиенте и половину на сервере (из KnockoutMVC)? - person Kyeotic; 24.01.2013
comment
@Tyrsius Нет, когда вы говорите код модели представления, вы имеете в виду, например, объявить некоторые свойства модели представления на сервере, а затем другую половину свойств на клиенте? Это совсем не то, что я говорю. - person AaronLS; 24.01.2013
comment
@AaronLS Итак, вы имеете в виду определить свои модели на C # с помощью KnockoutMVC, а затем написать все функции в javascript, чтобы они запускались на стороне клиента? Если нет, то я действительно не понимаю, какой код, по вашим словам, должен быть выполнен в KMCV. - person Kyeotic; 24.01.2013
comment
@Tyrsius, какой код, по вашему мнению, должен быть выполнен в KMVC * Я привел пример сохранения элемента. В любом случае это то, для чего вы бы делали обычную публикацию или ajax, поэтому делать это вместо функции KMVC проще, чем ajax, и более эффективно, чем обычная публикация. AddNewItem, SaveEditItem, вещи, которые в одностраничном приложении обычно были бы запросом ajax. - person AaronLS; 24.01.2013
comment
@AaronLS Но для этого вам нужно определить модель на C#. Затем вы заканчиваете тем, что пишете весь код на стороне клиента для этой модели в javascript, поэтому код вашей модели составляет половину на половину. Я думаю, что это действительно плохая идея. Особенно, если вы сохраняете код, который должен использовать часть этого кода модели на стороне клиента (например, проверку), а он не может. Вы собираетесь создать еще больший беспорядок, разделяя код виртуальной машины между C # и JS, чем просто переходя на чистый один или другой. Но переход на чистый C# с KMVC означает потерю всех преимуществ производительности на стороне клиента. Я не вижу никаких хороших способов использования KMVC. - person Kyeotic; 24.01.2013
comment
@Tyrsius переходит на чистый C# Я никогда не видел фреймворка, который позволил бы вам перейти на чистый C# для веб-кода на стороне клиента, не считая Silverlight. Можете ли вы указать мне на такие рамки? Я бы тоже не хотел писать приложение на чистом javascript. - person AaronLS; 24.01.2013
comment
@Tyrsius Для простой проверки вы можете создать разметку, в которой используются библиотеки JS на основе атрибутов, такие как jquery.validation.unobtrusive, чтобы вам не приходилось писать JS для проверки. Для более сложной проверки вы ДОЛЖНЫ написать javascript или обойтись без проверки на стороне клиента. Таким образом, вы получаете простую проверку бесплатно, а сложная проверка может выполняться на чистом C# на стороне сервера без какой-либо обратной связи со стороны клиента и обрабатывается так же, как вы обычно делаете, возвращая сообщение об ошибке, которое заполняет свойство, сопоставленное с элементом. Если вам нужна сложная клиентская сторона правила, для этого требуется JS. - person AaronLS; 24.01.2013
comment
@Tyrsius Что привлекает в KMVC, так это то, что вы можете двигаться к написанию меньшего количества JS. 1) Выражения свойств, 2) Функции. Моя точка зрения заключалась в том, что функции не должны считаться плохой функцией, потому что, если вы используете их правильно, вы должны использовать их только в ситуациях, когда вы ранее все равно выполняли запрос к серверу. Они позволяют выполнять тот же запрос, но меньшим количеством кода. - person AaronLS; 24.01.2013
comment
Мы должны переместить это в chat.stackoverflow.com/rooms/23257/ - person Kyeotic; 24.01.2013
comment
@Tyrsius, я рад, что нашел эту страницу, спасибо за это. Я был соблазнен обещанием более простой разработки и рассматривал возможность использования KMVC в моем текущем проекте, но опасался зависимости от сторонней библиотеки, не зная больше. К счастью, моя осторожность привела меня на эту страницу. Ваше замечание о том, что вызовы сервера мешают выполнению Knockout, имеет решающее значение и успешно удержало меня от KMVC (при всем уважении к разработчикам KMVC). Тот факт, что Джон Папа согласен с тобой, является решающим фактором. Я пойду со старым добрым KO + MVC. - person David Barrows; 11.07.2013
comment
Вопрос был задан, зачем использовать Knockout MVC, а не почему НЕ использовать его. Если вы разрабатываете что-то для локальной локальной сети, где производительность не имеет значения, это может иметь преимущества для людей, незнакомых с нокаутом, например, им будет намного проще использовать. - person pilavdzice; 15.08.2014
comment
Нет, вопрос заключался в том, есть ли причина использовать KMVC вместо Knockout, на что я ответил «Нет». Также довольно часто люди спрашивают о причинах сделать что-то, чтобы рассказать о том, почему они не могут этого сделать; есть какое-то отношение к этому. - person Kyeotic; 15.08.2014
comment
Блестящий ответ. Я люблю C# и люблю JavaScript, но зачем использовать серверную структуру для компиляции HTML и выражений привязки Knockout, мне непонятно. Почему бы просто не изучить и не манипулировать KO на клиенте в первую очередь? - person James Wright; 17.09.2014
comment
Тирсиус совершенно не прав. Возможно, вы никогда не использовали KnockOutMVC для создания полноценного приложения. Приложениям, где требуется манипулирование данными (СОЗДАНИЕ, ОБНОВЛЕНИЕ, УДАЛЕНИЕ), для работы требуется функция на стороне сервера, без этого вы не можете жить. KnockOutMVC создает всю модель для использования на клиенте, обрабатывает подключение к серверу и создает представление с привязками для использования клиентом. Вся клиентская логика хранится в клиенте без нужд сервера, возможно, вы упустили интерпретацию правильного ее использования. - person Diego Mendes; 21.11.2014
comment
Просто чтобы завершить мой последний комментарий: как комментирует AaronLS, вы можете создать модель на сервере и встроить в клиентскую модель, где находятся функции, нет ли проблем и беспорядка, если вы всегда следуете этой логике, если ваша модель меняется, насколько просто везде менять с помощью JS? При использовании KMVC вся логика согласована. Образцы, используемые в их документах, очень плохи для реальных проектов, но предназначены для обучения, и вам следует создать собственный код, чтобы воспользоваться преимуществами этой библиотеки и удалить бесполезную серверную обработку. - person Diego Mendes; 21.11.2014
comment
@DiegoMendes Да, CRUD нужно что-то на сервере, но не вся модель представления. KMVC помещает всю модель представления на сервер, и каждый раз, когда свойства изменяются, он обращается к серверу, чтобы получить эти изменения. В обычном приложении KMVC на сервер отправляется только сохраненный элемент, но в KMVC отправляется вся модель представления. Я не говорю, что это не проще, я говорю, что это расточительно и медленно. - person Kyeotic; 21.11.2014
comment
@Tyrsius, если вы используете все сгенерированные методы, созданные KMVC, код вернет всю модель представления на сервер, как правило, это то, что мы делаем, когда обновляем что-то на сервере. В любом случае, если вам нужно специальное событие, когда на сервер нужно отправить только немного информации, вы можете создать его вручную, как обычно делаете на KO. Преимущества KMVC — генерация модели представления и представления с готовыми привязками, остальное вы делаете на клиенте. - person Diego Mendes; 22.11.2014
comment
Разве не написать javascript не веская причина? хотя есть и другие способы получить этот результат. - person Luiz Felipe; 01.06.2017
comment
Ну, это остановило любые шансы на то, что я обдумаю это :) - person Terry Delahunt; 20.10.2017

Я только что наткнулся на этот вопрос, на который есть довольно негативные ответы. Я собираюсь быстро добавить свои пять центов.

Я только начал использовать KnockoutJS. Поскольку я создаю приложения ASP.NET MVC, мне показалось логичным использовать что-то вроде Knockout MVC. По большей части это кажется отличной идеей. Я не хочу тратить время на написание javascript и <!-- ko --> комментариев на своих страницах, если я могу сделать то же самое, используя функции .Net, которые я знаю и люблю.

Сказав это... да, на данный момент у KMVC есть ограничения. Отправка всей модели обратно на сервер — большая проблема. Итак, что я сделал, так это запустил свой собственный форк нокаута-mvc. Изменения были обязательно поспешными в данный момент. Но теперь у меня есть возможность:

  • создавать подконтексты (с совершенно разными моделями или компонентами модели представления)
  • передавать выбранные части модели обратно при вызове сервера
  • ожидать от звонка другую модель, чем та, что была отправлена
  • пожарные события вокруг вызовов ajax
  • поддержка большего количества типов ввода html5
  • передавать токены защиты от подделки на сервер через заголовки (для вызовов ajax)
  • наверное больше я забыл

Я надеюсь вернуться в ближайшее время и действительно очистить то, что я сделал. Надеюсь, автор включит эти изменения в свой код. Если нет, я думаю, я буду держать свою собственную вилку. В любом случае, есть свет в конце туннеля. Возможно, KMVC нуждается в доработке в его нынешнем виде, но я считаю, что эта концепция определенно того стоила.

я определенно думаю

Если Knockout MVC умрет завтра, Интернет станет лучше.

был немного суров.

Изменить:

Я просматривал комментарии и снова посмотрел на исходный вопрос. Сделав это, я думаю, что к моему ответу следует добавить немного больше:

Во-первых, первоначальный вопрос был следующим: Есть ли причина, по которой я буду использовать Knockout MVC вместо Knockout JS? Чтобы ответить/уточнить (может быть, я просто придирчив), что: Knockout MVC — это фреймворк, предназначенный для проще интегрировать KnockoutJS с вашим приложением ASP.NET MVC. В основном это достигается за счет использования знакомых строго типизированных конструкций для создания тегов KnockoutJS. Это не замена KnockoutJS. Обязательно используйте KnockoutJS. На самом деле вопрос заключается в том, следует ли использовать Knockout MVC также.

Сказав это, вы, как разработчик, по-прежнему можете выбирать, когда использовать различные аспекты всех доступных вам инструментов. Если вы хотите обработать определенный аспект функциональности, выполнив полный запрос к серверу, сделайте это. Если вы хотите выполнить запрос ajax для извлечения/обновления данных, сделайте это. Если вы хотите выполнять функции исключительно на стороне клиента, сделайте это.

Использование Knockout MVC не мешает использовать KnockoutJS в полной мере. Использование Knockout MVC не мешает писать дополнительный код javascript для обработки любого количества клиентских функций. Тот факт, что Knockout MVC предоставляет вам короткий путь для генерации обратных вызовов ajax на сервер, не означает, что вы должны их использовать. Хотя, если ваше приложение когда-либо сохраняет данные, в какой-то момент ему придется позвонить домой.

Есть причины для создания серверной части приложения с использованием ASP.NET MVC по сравнению с использованием Apache только для обслуживания статических файлов HTML и сценариев. Knockout MVC позволяет вам продолжать пользоваться теми же преимуществами при интеграции KnockoutJS.

person Nigel Whatling    schedule 17.09.2013
comment
Я думаю, что I don't want to be spending time writing javascript — это и причина существования KMVC, и его самый большой недостаток. Вы боретесь с сетью, когда пытаетесь избежать javascript. - person Kyeotic; 17.09.2013
comment
@Tyrsius, мне придется с тобой не согласиться. Я не пытаюсь избежать javascript. Я избегаю необходимости вручную писать javascript, когда я могу использовать инструмент, который сделает это за меня. По той же причине я бы в первую очередь использовал KnockoutJS. Я мог бы написать эту функциональность сам, но зачем, если все это было упаковано в хороший набор инструментов для меня. Точно так же, зачем вручную писать javascript (по крайней мере, основные биты) в моих файлах, когда я могу заставить KMVC сделать это за меня? Не должно быть никакой разницы в результирующей странице, только в усилиях по разработке. - person Nigel Whatling; 18.09.2013
comment
За исключением того, что на результирующей странице есть разница, ваш ответ касается ее: KMVC требует, чтобы сервер что-либо делал. Обычное приложение KnockoutJs не работает. Это не просто разница в усилиях по разработке, это разница в производительности. - person Kyeotic; 18.09.2013
comment
Я думаю, вы предполагаете худший сценарий. При правильном использовании KMVC должен быть инструментом, помогающим в создании привязок Knockout и т. д. Преимущества в производительности сохраняются. Веб-приложение, конечно, по-прежнему будет зависеть от сервера, по крайней мере, для выполнения начальной генерации страницы... так же, как и любое веб-приложение. - person Nigel Whatling; 18.09.2013
comment
Вот только их все еще нет. Как только функция модели представления отправляется на сервер для выполнения своей логики, как это делает любая функция модели представления или computed observable в KMVC, выигрыш в производительности теряется. Knockout сделал бы это на стороне клиента, KMVC нужен запрос к серверу. Обойти это невозможно: KMVC жертвует производительностью и отзывчивостью, чтобы не писать javascript. - person Kyeotic; 18.09.2013
comment
Мой 1 цент стоит: не все веб-приложения развернуты в Интернете; некоторые находятся на веб-серверах в интрасетях; они работают по проводу со скоростью 100 Мбит/с, так что обмен данными с сервером является тривиальной нагрузкой. - person Tim; 01.06.2015
comment
@Nigel Whatling У вас когда-нибудь была возможность разветвить свои изменения? - person usr4896260; 12.04.2017

Я нахожу ответ Тирсиуса слишком отрицательным. Knockout MVC все еще находится на ранней стадии разработки, но, насколько я вижу, он имеет некоторые преимущества и менее загружен сервером, чем, например, Webforms. Зависимости видимости полностью обрабатываются клиентом, только при использовании функций вызов выполняется на сервер. При работе со сложными структурами данных иногда в любом случае требуется пройти через сервер, поэтому Knockout MVC может быть хорошим способом сэкономить на написании большого количества Ajax-обработки самостоятельно.

Это правда, что он всегда отправляет всю модель туда и обратно, что дает некоторые накладные расходы, в отличие от создания ее самостоятельно. Но полностью списывать со счетов я бы не стал. Особенно, когда он получает надлежащую обработку на стороне клиента для сложных проверок в будущем.

person Erwin    schedule 27.07.2012
comment
Итак, лучшее, что вы можете сказать об этом фреймворке, это то, что в будущем он станет лучше? - person Kyeotic; 23.01.2013

Я наткнулся на этот пост после небольшого поиска о нокауте mvc. Хотя я согласен с пустой тратой пропускной способности сети, меня очень соблазнила эта строка кода:

@{
  var ko = Html.CreateKnockoutContext();
 }

Это аккуратный и чистый способ создания модели нокаута. Кто-нибудь использовал нокаут MVC только для этой функции и без переноса всей логики на сервер?

person Sam    schedule 11.03.2013
comment
Я хотел бы увидеть ответ на это, поскольку я повторяю много кода на стороне клиента, который я уже написал на стороне сервера. - person IronicMuffin; 24.06.2013
comment
@Sam Я нашел способ сделать это без KnockoutMVC. Просто используйте Knockout Mapping: var myViewModel = ko.mapping.fromJS([Return MVC model as JSON]);. Работает без AJAX. - person Lasse Espeholt; 12.10.2013
comment
Я перестал использовать нокаут для AngularJS, но спасибо, что поделились этим :) - person Sam; 12.10.2013

Прелесть Knockout.js заключается в том, что вы можете обслуживать свое приложение, просто передавая JSON туда и обратно с сервера, без необходимости отправлять все представление, которое сервер должен был разбить на фрагменты для генерации HTML.

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

Мое предложение состояло бы в том, чтобы использовать Knockout.js для привязки, чтобы привязка происходила на клиенте, а не на сервере, если это цель, к которой вы стремитесь. Если вы хотите, чтобы ваше представление было привязано к данным на сервере, используйте razor.

person OnResolve    schedule 23.07.2012
comment
+1 тоже. комбинация нокаута на клиенте с бритвенным сервером кажется мне «разумным» способом. Прекрасная фраза tyrsius находит отклик у всех, кому когда-либо приходилось иметь дело с веб-формами!! - person jim tollan; 23.07.2012
comment
@jimtollan Кажется, что с KO-JS вам нужно дважды написать свою ViewModel. Один раз на клиенте, другой на сервере. Это кажется не очень разумным. Казалось, что KO-MVC решил эту проблему. Однако я не понимал, что это принесло с собой целый ряд проблем. - person dotnetN00b; 24.07.2012
comment
@ dotnetN00b, это правда. В некоторых случаях эту проблему решит плагин нокаут-мэппинга, но в других случаях вам может потребоваться написать свои модели представления дважды. Дело в том, что ваши модели представления С# не должны иметь в них одни и те же функции, просто он поддерживает. Любое действие на стороне клиента будет в ваших моделях представления KO, а любое действие на сервере (если оно есть) будет в С#. В обмен на это вы получаете быстрые, производительные представления на стороне клиента и непротиворечивые данные. - person Kyeotic; 24.07.2012
comment
@dotnetN00b, не всегда. Я обнаружил, что в большинстве случаев ViewModel определяется только в js, поскольку действия контроллера будут просто отправлять JSON на основе модели предметной области, а не отдельной модели представления. - person OnResolve; 24.07.2012
comment
@OnResolve Как вы получаете исходные данные для представления? Если они представляют собой что-то более сложное, чем прямая модель записи базы данных, они, вероятно, получат модель представления на стороне сервера. - person Kyeotic; 24.07.2012
comment
@Tyrsius Я использую KO для SPA, поэтому я выпущу один и обычно довольно голый вид. Остальное делается путем передачи JSON туда и обратно. Я полагаю, что для не-СПА у вас будет и то, и другое - мой комментарий был просто для того, чтобы дать ему понять, что это не всегда так :) - person OnResolve; 24.07.2012
comment
@OnResolve Нет, это хороший момент. SPA может не нуждаться в моделях просмотра на стороне сервера. Пока я сделал только один в проекте, но мне все еще нужна модель представления для загрузки неначальных состояний. Возможно, я мог бы найти другой способ сделать это и избежать дублирования. - person Kyeotic; 24.07.2012
comment
@Tyrsius Ну, мои ViewModels (на стороне сервера) - это просто модели. У меня есть классы, которые обрабатывают бизнес-логику в другом месте (также на стороне сервера). - person dotnetN00b; 24.07.2012

Более того, Knockout.js отлично справляется с отображением/удалением/вставкой/обновлением данных на стороне клиента, а также с вычислением данных на стороне клиента. Если реальная бизнес-логика так проста, мы должны применить Knockout.js напрямую.

Правда в том, что бизнес-логика не всегда так проста. Например, когда клиент вставляет новую запись в представление, системе, возможно, потребуется проверить аутентификацию пользователя, установить значения по умолчанию для нового созданного объекта на основе некоторой бизнес-логики или формулы и т. д. Все это в любом случае должно перейти на сторону сервера и проверить логика на основе данных базы данных.

Разработчик может перевести всю необходимую бизнес-логику в методы java-скрипта внутри модели представления Knockout.js. Но таким образом дизайн нарушает правило централизованного управления бизнес-логикой.

Обслуживание станет кошмаром для такого дизайна.

Резюме: выбор фреймворка действительно зависит от требований бизнеса. Иногда производительность не стоит на первом месте.

person ChinaHelloWorld    schedule 17.11.2013

Я также вижу много хороших вариантов использования библиотеки Knockout MVC. Я с трудом смог интегрировать KnockoutJS в наше веб-приложение MVC именно по причинам, которые указал, например, @ChinaHelloWorld. Вот несколько случаев, когда я нахожу это чрезвычайно полезным.

  1. Строго типизированные привязки

Мне понравились хорошие HTML-хелперы со строгой типизацией, которые стали совершенно бесполезными и беспорядочными, когда дело дошло до настройки KnockoutJS. Лучшее, что я мог сделать, это вручную прикрепить свои атрибуты привязки с дополнительным параметром вспомогательных методов, но мне снова пришлось использовать магические строки. Мне нравятся помощники, предоставляемые Knockout MVC для создания входных данных и других элементов со строго типизированными привязками на основе выражений C#. Однако здесь я хотел бы упомянуть, что мне не хватает атрибута имени сгенерированных полей, поэтому мне нужно было немного его подправить.

  1. Синтаксис привязки со строгой типизацией (вид)

При использовании чистых привязок строк всегда есть большая вероятность опечатки или точного знания правильного формата привязки, которую вы хотите применить. С плавным API Knockout MVC и VS IntelliSense очень легко применять правильные привязки.

  1. (Почти) Автоматическое преобразование вычисляемых свойств C# в вычисляемые привязки

Просто с применением небольшого атрибута [Computed] Knockout MVC может сгенерировать соответствующее выражение привязки в правильном синтаксисе KnockoutJS. Это тоже очень полезно, я думаю.

  1. Нет дублирования кода модели представления

Классическим способом мне нужно было иметь класс модели представления в коде C#, а затем (почти) такой же код модели представления в JS (с наблюдаемыми). Что ж, ЭТО меня расстроило, и я был очень счастлив, когда увидел технику, используемую в Knockout MVC. Однако мне нужно было немного настроить его, чтобы иметь возможность использовать его с действительно сложными моделями представления (вложенными моделями представления, коллекциями и т. д.) и иметь возможность расширять отображаемые модели представления Knockout, например, с помощью любого необходимого пользовательского метода JS или вычисляемого наблюдаемого. .

Итак, вот как минимум четыре очень хороших момента. И насчет обхода модели представления: никто не говорил, что кому-то из нас нужно использовать серверный механизм обработки Knockout MVC. Я бы тоже не стал использовать это, только если есть какая-то сложная бизнес-логика, которую действительно нужно обрабатывать на сервере. Но в большинстве случаев Knockout MVC предназначен только для упрощения процесса привязки и настройки MVC Views и KnockoutJS. Так что я не совсем понимаю плохие мнения выше. Я думаю, что те, кто писал эти мнения, не потрудились изучить хотя бы базовые концепции Knockout MVC. Вы определенно НЕ должны использовать Knockout MVC вместо KnockoutJS, кроме KnockoutJS. Понимание Javascript и хотя бы основ KnockoutJS по-прежнему является обязательным в любом случае.

Я бы хотел, чтобы автор продолжил разработку Knockout MVC, потому что, помимо этих положительных моментов, есть некоторые особенности и усовершенствования, которые действительно сделали бы его еще более мощным.

person Zoltán Tamási    schedule 11.12.2013
comment
Что касается пункта 4: вам не нужно дублировать свою модель представления, если у вас есть хорошая техника сопоставления/слияния на стороне клиента, поэтому здесь у меня есть только свойства модели, которые мне не нужно устанавливать на сервере, это мне не нужно создавать их с обеих сторон. - person David Freire; 18.03.2015
comment
@DavidFreire это верно для менее сложных приложений, но при создании действительно сложного, в конце концов, мне всегда хотелось, чтобы эти наблюдаемые были объявлены. Например, если я хочу создать вычисление, основанное на некоторых других наблюдаемых, тогда я должен объявить их, не могу отображать их на лету. На самом деле я отказался от Knockout MVC в прошлом году и использовал свои собственные помощники на стороне сервера, и я создал инструмент для перевода моих моделей C# в TypeScript. Эта техника отлично работает вместе. Однажды, если у меня будет время, я опубликую этот инструмент где-нибудь. - person Zoltán Tamási; 18.03.2015
comment
Вы совершенно правы, это проблема, если вы используете вычисляемые наблюдаемые в своем представлении, но для более простых случаев это работает. - person David Freire; 18.03.2015
comment
@ZoltánTamási, вам когда-нибудь приходилось публиковать упомянутый вами инструмент? - person kayess; 09.12.2016
comment
@kayess Если вы имеете в виду конвертер C # в TS, я не публиковал его, и хотя я все еще хотел бы, к сожалению, я не планирую, потому что это будет довольно много работы, и у меня действительно ограниченное свободное время в этих годы. Я использую его как часть нашей внутренней структуры. Хотя в интернете есть несколько похожих вариантов. - person Zoltán Tamási; 09.12.2016

В шаблоне .Net MVC модель представления уже четко обозначена в каждом представлении/частичном представлении с помощью тега «@model yourmodel», что может помочь разработчику понять, что будет делать в этом представлении.

При использовании шаблона Knockout.js MVVM вы, возможно, не увидите никакой модели представления .Net, кроме тегов, таких как «привязка данных» в представлениях. Это сделало бы представление и контроллер несвязанными и затруднило бы отслеживание логики, особенно для нового разработчика в команде.

Я считаю, что KnockoutMVC может решить такие трудности и сэкономить много кода javascript, что затруднит обслуживание и понимание системы.

Поскольку KnockoutMVC заставляет дизайн по-прежнему придерживаться модели представления на стороне сервера, которую легко отслеживать и поддерживать, поскольку это код C#.

Для бизнес-проекта менеджер всегда должен сосредоточиться на простоте разработки, простоты обслуживания, простоты обновления, простоты понимания и быстрой доставки, чтобы заработать деньги.

Немного пожертвуйте производительностью, но упростите ее. Ключевым моментом должна быть согласованность на стороне клиента и на стороне сервера. Javascript — большая проблема с обслуживанием.

Действительно ли имеет значение отправка всей модели представления обратно на сервер? Если это так, мы можем разделить большую модель на несколько маленьких моделей.

person ChinaHelloWorld    schedule 17.11.2013
comment
Гениально и полностью согласен, основываясь на очень горьком опыте - person Terry Delahunt; 20.10.2017

У вас все еще есть производительность, если вы не используете функции, созданные komvc. Как сказал Найджел, первоначальная генерация страницы все равно должна быть сгенерирована сервером. Вы всегда можете добавить пользовательские сценарии и создать функции на стороне клиента, которым не нужно будет возвращаться на сервер. Это инструмент, который дает разработчику немного производительности. Сравнение с веб-формами по производительности явно преувеличено. Ребята, это один из инструментов, который точно поможет вам уложиться в срок.

person Jacobian    schedule 16.10.2013

Я добавлю свои 2 цента в пользу нокаута, хотя его немного сложнее написать по сравнению с нокаутом MVC, польза, которую вы получаете, огромна, когда дело доходит до повторного использования. Клиентский код может гармонично работать и с другими технологиями.

Оставляя в стороне точку зрения безопасности, я лично считаю, что нокаут js — это способ усложнить asp.net MVC, и его следует использовать как есть (нокаут js) с чистыми приложениями RESTful, такими как asp.net webapi.

person Govin    schedule 27.03.2014
comment
Какая перспектива безопасности? - person Homer; 26.04.2014
comment
Как правило, вам нужно отправить гораздо больше информации клиенту, если вы используете клиент для управления тем, что скрывать/показывать, и другими функциями, которые обычно выполняются в примерах нокаута. - person pilavdzice; 15.08.2014
comment
Перспектива безопасности в моем контексте может относиться к этому, например: stackoverflow.com/questions/19375173/mvc-4-web-api-security - person Govin; 18.09.2014

Knockout MVC — это мощное расширение для ASP .NET MVC, которое позволяет вам реализовать функциональность клиента веб-сайта непосредственно в вашем проекте .NET с помощью удобных для разработчиков API Fluent API без Javascript и удаления большого количества дублированного и повторяющегося кода.
Knockout MVC — это так же, как кодирование бритвы ASP .NET MVC, и вы получаете функциональность клиента без каких-либо дополнительных хлопот.
Вам не нужно кодировать модель представления и строки кода привязки.
Я использую koMVC на большинстве моих веб-сайтов, а также сокращение времени разработки, простота обслуживания и минимальная кривая обучения — огромная отдача.
Я предлагаю вам проверить их веб-сайт и попробовать несколько живых примеров. http://knockoutmvc.com
Вам не потребуется много времени, чтобы влюбиться в него.

person POM    schedule 23.11.2016
comment
Согласованный. В то же время, поскольку это обертка для нокаута (а не замена), вы можете использовать его по мере необходимости. Хотелось бы, чтобы он все еще находился в разработке для поддержки последней версии нокаута. - person usr4896260; 12.04.2017

MVC — это архитектурный шаблон, который разделен на три компонента: модель, представление и контроллер.

KnockoutJS лучше всего работает с архитектурой MVC, поскольку привязка данных фреймворка требует использования контроллера. Существуют фреймворки, такие как AngularJS, которые больше ориентированы на внешний интерфейс и поэтому лучше работают с архитектурным шаблоном MVVM (модель, представление, модель представления). Их функции привязки данных также не требуют использования контроллера, который уменьшает объем привязки.

person Bbo    schedule 09.02.2018