Backbone.js с ASP.NET MVC - PullRequest
       50

Backbone.js с ASP.NET MVC

20 голосов
/ 23 августа 2011

В последние несколько дней я читал о Backbone.js и о том, как он упрощает взаимодействие кода JS с элементами View, в основном в HTML. Я также читал о различиях между KnockoutJS и Backbone.js. Теперь я думаю о том, приведет ли использование одного или другого к неизбежному дублированию кода, который у нас уже есть в нашем приложении MVC (в основном ViewModels и маршруты в global.asax) внутри наших представлений. По сути, мы должны кодировать другой набор моделей в Backbone или Knockout. Как я понимаю, с KnockoutJS это еще более распространено, поэтому я подумал, что выберу Backbone, но теперь я думаю, что это не так уж и отличается - после нескольких примеров я увидел, что такое же дублирование становится очевидным.

Кроме того, как нам поддерживать такое приложение, если, например, у нас уже есть несколько частичных представлений MVC, и теперь мы должны воссоздать их в Backbone, используя некоторый шаблонизатор, такой как шаблоны JQuery?

Ответы [ 5 ]

10 голосов
/ 23 августа 2011

В последнее время я сам читал о backbone и knockoutjs, а также размышлял о том, как использовать фреймворк с asp.net mvc. Один из подходов, позволяющих избежать дублирования моделей, заключается в сериализации (json) видовой модели на стороне сервера и использовании ее в качестве базовой или нокаутной модели. Положительный побочный эффект: ваши клиентские модели уже содержат данные о загрузке страницы и не должны извлекать данные с помощью ajax-запроса при первой загрузке страницы. Я знаю, что только сериализации серверной view-модели недостаточно для магистрали / нокаута, но это может быть отправной точкой. Возможно, сериализованная модель может быть свойством клиентской модели.

О шаблонах jquery я обычно помещаю шаблон jquery в частичное представление. Таким образом, они легко отображаются в вашем представлении так:

<script id="SomeTemplate" type="text/x-jquery-tmpl">
    @Html.Partial("Templates/SomeTemplate")
</script>

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

6 голосов
/ 16 марта 2012

Я однажды использовал Backbone с Rails в проекте, и в итоге я переделал все свои шаблоны в Underscore - underscore.js является зависимостью от Backbone и поставляется с собственным языком шаблонов.

Мое приложение не было огромным, поэтому оно не заняло много времени. Если ваше приложение уже довольно сложное, то это может быть другая история.

Как сказал Сухас, коллекция Backbone имеет возможность извлекать все ваши модели с сервера, и вы можете отправлять их обратно, используя функцию сохранения, которая используется в вызовах Jquery ajax. Все, что вам нужно сделать, это убедиться, что они сериализуются через JSON.

Я обнаружил недавнюю серию из 4 статей об использовании Backbone с ASP.NET MVC 3 - возможно, это будет полезно для вас: http://www.bitcandies.com/blog/2011/asp-net-mvc3-restful-application-tutorial-with-backbone-js-part-i/

Кроме того, это хороший пример для меня, когда я обращаюсь к .net mvc:)

3 голосов
/ 23 августа 2011

Я рекомендую то, что сказал Дданго в своем комментарии к своему ответу.Начните разработку новой функциональности с помощью магистрали или нокаута.У нас есть веб-приложение, в котором большая часть сайта находится на обычном asp.net mvc, и как только мы узнали о нокауте, мы начали создавать страницы, использующие нокаут.Они могут мирно сосуществовать.Если тогда есть желание заменить старую функциональность по какой-либо причине (ремонтопригодность или у вас слишком много времени на руках;)).Тогда вы можете сделать это по частям за раз.

Стратегия, которую мы начинаем использовать, заключается в том, чтобы контроллеры asp.net mvc имели два вида функций.

  1. Действия, которые возвращают данные (используется knockout для заполнения шаблонов / элементов управления)
  2. Действия, которые возвращают HTML, предназначены для запросов страниц.

HTH

2 голосов
/ 23 августа 2011

Если вы не хотите переписывать ваши частичные значения в шаблоны, вы можете обрабатывать их как таковые, используя методы контроллера, которые возвращают частичное представление в виде HTML, которое вы получаете при рендеринге или инициализации представления Backbone, например:

        public ActionResult SomeAction(){ 
           var viewModel = new ViewModel(); 
           return View("~/path/to/partial/view.ascx", viewModel); }
        }

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

(я бы поспорил с этим как с чем-то иным, кроме как с временным переходом, когда вы переходите на шаблоны - вы всегда будете делать посты для визуализации чего-либо, когда у вас уже может быть сторона с данными, и вам просто нужна строка шаблона)

re: ViewModels, загрузка данных из контроллера через JsonResult или путем первоначальной сериализации - путь.Вам не нужно дублировать большой объем кода для моделей Backbone - json загружается в модель и анализируется по атрибутам, к которым вы можете получить доступ через API Backbone.

определенно рекомендую эти статьи (хотя не asp.net mvcконкретный):

http://backbonetutorials.com/what-is-a-model/

http://www.jamesyu.org/2011/01/27/cloudedit-a-backbone-js-tutorial-by-example/

Урок cloudedit является версией позади (Controllers сейчас Routers), но все еще является хорошим местомначать - и параллели между Rails и ASP.NET MVC легко увидеть.

Не могу говорить с нокаутом!

1 голос
/ 16 марта 2012

Вы можете использовать ваше приложение ASP.NET MVC в качестве службы RESTful, испускающей JSON для ваших моделей представления. Модели Backbone могут напрямую отображаться в этот JSON.

...