Ответ 1
Пока я не могу разговаривать с backbone.js, могу сказать, что я использовал нокаутом для отличного эффекта в сочетании с ASP.NET MVC. Каждое приложение ASP.NET, которое я видел на сегодняшний день, использует сочетание клиентского и серверного представления. Всегда найдутся моменты, когда более удобно генерировать представления на стороне сервера. Возьмем, например, условные элементы пользовательского интерфейса на основе того, аутентифицирован ли пользователь или нет ли у них определенного разрешения. Возможно, вы не захотите, чтобы веб-опытный пользователь мог изучить ваши шаблоны на стороне клиента и разработать все функции, которые они не получают. Конечно, вы можете обойти это путем асинхронной загрузки различных клиентских шаблонов, бла-бла-бла-бла-бла-бла-бла-бла-бла-бла-бла-бла-бла-бла-бла-бла-бла-бла-бла-бета или для создания клиентских кодов для создания ваших клиентских шаблонов... Кроме того, если SEO что-то означает для вас, вы можете поцеловать шаблоны на стороне клиента ( прощай.
Итак, сладкое пятно, на мой взгляд, - это то, что хорошо и хорошо. По моему опыту, я нашел ASP.NET MVC, чтобы преуспеть в обоих.
Почему ASP.NET MVC является удивительным
- Макеты (MasterPages)
- Бритва (безопасные по типу виды с добротой intellisense)
- ActionFilters (удивительное место для применения таких конвенций, как ведение журнала, auth и т.д.)
- Сериализация JSON бесплатно -
return Json(model)
- Связывание и проверка модели
- IoC и MVC - лучшие друзья (победа)
- Аутентификация + авторизация
- Много других вещей, о которых я не могу думать.
Используя клиентскую инфраструктуру для создания представлений, на самом деле все, что вам не хватает, это Razor. Вы даже можете использовать макеты в некоторой степени.
Подход, который я принимаю к разработке с помощью ASP.NET MVC, должен начинаться с того, что приложение работает на стороне сервера. Это заставляет вас думать о том, что вам нужна ваша структура URL, что заслуживает контроллера, какими должны быть ваши маршруты. Это также означает, что вы получаете преимущества безопасности типов и автозаполнения во время первой итерации просмотров. В конце этого упражнения у вас есть простое, совместимое со стандартами решение (надеюсь), которое работает на любом известном человеку устройстве, которого Google не может получить достаточно.
Затем я начал применять постепенный подход к реализации срезов клиентской функциональности. На стороне клиента я пишу несколько javascript, чтобы захватить запрос, который я хочу превратить в запрос AJAX, и обработать ответ, используя переведенную версию вида Razor. На стороне сервера я использую подход на основе соглашения с использованием фильтра действий. Этот фильтр действий выполняет примерно следующее:
- Является ли ActionResult ViewResult?
- Что такое тип Accept?
- HTML - Возвращает PartialViewResult с тем же именем, с префиксом "_", с той же моделью
- JSON - возвращает JsonResult с той же моделью
- Что такое тип Accept?
- Является ли ActionResult результатом RedirectToRoute?
- Возвращает EmptyResult (или, возможно, вы можете вернуть URL-адрес в JsonResult)
При таком подходе вы можете добавить функциональность AJAX без изменения одной строки кода в контроллерах. Альтернативный подход заключается в том, чтобы следовать Принципу Thunderdome и иметь ActionInvoker, ответственный за упаковку модели в соответствующем типе результата на основе контекста запроса. Я не разработал, как навигация на стороне сервера (переадресация) подходит для этого подхода.
Отходы, начинающиеся с реализации на стороне сервера, - это удвоение кода представления кода (шаблон Razor + js). В зависимости от того, сколько вашего приложения вы хотите реализовать на клиенте, это может быть или не быть проблемой. Spark является исключением из этого в том, что вы действительно можете получить его создать клиентские шаблоны для вас! Недостатком Spark является то, что вы теряете intellisense (там плагин для него, но его дерьмо), который не является незначительной потерей, плюс я просто предпочитаю Razor (его испекли, не нужно настраивать и не уходит в любое время в ближайшее время).