Backbone.js с ASP.NET MVC

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

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


person mare    schedule 22.08.2011    source источник
comment
тот же вопрос не дает мне покоя, и я рад, что ты его задал   -  person bhargav    schedule 07.06.2012


Ответы (5)


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

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

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

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

person Robin van der Knaap    schedule 22.08.2011
comment
Это дает некоторую дополнительную полезную информацию. Надеюсь, другие тоже ответят. - person mare; 23.08.2011
comment
Привет, я новичок в backbone и knckout. Маленький вопрос ... нужно ли мне использовать маршрутизатор в backbone.js (в настоящее время я использую asp.net mvc4 webapi). Я даже чувствую, что лучше использовать нокаут для mvc 4 веб-API (потому что нет необходимости в маршрутизаторах или контроллерах и т. д., предоставляемых backbone.js....?) - person bhargav; 07.06.2012

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

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

Как сказал Сухас, коллекция Backbone может извлекать все ваши модели с сервера, и вы можете отправлять их обратно, используя функцию сохранения, которая использует ajax-вызовы Jquery. Все, что вам нужно сделать, это убедиться, что они сериализованы через 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 :)

person PhillipKregg    schedule 15.03.2012

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

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

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

ХТН

person Jose    schedule 23.08.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.

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

person ddango    schedule 22.08.2011
comment
Знаешь, я беру это обратно. Я действительно не могу рекомендовать этот шаблон вообще. Если у вас есть время, чтобы поэкспериментировать с получением ваших данных, а затем сделать вызовы, чтобы вернуть html, у вас, вероятно, есть время, чтобы переписать некоторые шаблоны. - person ddango; 23.08.2011
comment
Далее я бы сказал, что если ваше приложение очень большое, просто разработайте новую функциональность с помощью Backbone, если можете, и медленно продвигайтесь к новому стандарту выполнения задач. Мы делаем что-то подобное с нашим приложением — ядром его являются веб-формы, но мы разрабатываем большинство новых функций поверх MVC с помощью Backbone. - person ddango; 23.08.2011
comment
я вроде понимаю, о чем вы говорите, но не могли бы вы опубликовать пару кода для действия контроллера и частичного представления MVC (или обычного представления) с кодом Backbone.js в нем? Таким образом, это будет легче понять, потому что фрагмент кода, который вы разместили выше, который возвращает частичное представление и соответствующую ему модель, довольно стандартен и прост. Я хочу посмотреть, как это будет выглядеть, когда Backbone.js появится в представлениях. - person mare; 23.08.2011

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

person Suhas    schedule 15.03.2012
comment
Это означает, что мне придется переписать свои действия для отправки данных JSON, хотя теперь они возвращают View/PartialView, прикрепленные к модели, не так ли? Переписать существующие или написать дополнительные, которые работают с JSON? - person mare; 16.03.2012
comment
Это верно. Подход, который я бы выбрал, заключается в том, что все новые действия, которые я написал, будут возвращать JSON, и я буду продолжать рефакторинг существующего в постепенном темпе, чтобы вернуть JSON. - person Suhas; 16.03.2012