2012-04-21 2 views
4

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

Я преобразовал все мои конечные точки MVC, чтобы просто возвращать представления, а затем я создал несколько других конечных точек, которые возвращают объекты JSON. Когда пользователь просматривает веб-сайт, сайт загружает основной фрейм пользовательского интерфейса. После этого Knockout.js загружает модель через вызовы AJAX. Это вызвало загрузку каждой страницы, а затем снова «загрузило», где, как и только с MVC, страница загрузилась, и все данные были представлены.

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

  • Объединить JSON конечные точки в поле зрения конечных точек и преобразовывать модели в формате JSON в коде с помощью @Html.Raw(Json.Encode(object))

, но тогда я должен получить поездку всех моих чистых JSON конечных точек.

Есть ли что-нибудь еще, что я могу сделать, чтобы передать данные конечной точки JSON в виде на сервере? Или любой способ получить модель и представление для загрузки в одно и то же время?

ответ

3

Ваша архитектура правильная, но вы хотите, чтобы начальная загрузка предварительно заполняла ваши представления данными из модели. В рамках действия контроллера, которое просто возвращает представления, вы должны поместить данные в ViewData. Затем представления сначала загружаются с помощью значений модели, и каждый элемент пользовательского интерфейса может иметь обновление AJAX, которое вызывает действие Controller для этого конкретного поля.

Это также будет ideal case for a ViewModel. Это может помочь as well.

+0

Благодарим вас за ответ! Просто чтобы я мог убедиться, что я на той же странице, я должен назвать конечные точки JSON внутри просмотров? Что-то вроде: var model = @ Html.Action («Данные», «Элементы»), где модель находится в js? –

+0

Вызывайте только конечные точки JSON для обновлений. Если вы создаете объект ViewModel и взаимодействуете с ним в Javascript, вы должны иметь только представления, взаимодействующие с этим объектом, и иметь методы, которые инкапсулируют запрос AJAX (взятие с конечными точками контроллера). Это позволит вам делать такие интеллектуальные вещи, как кеширование или обновление. –

+0

Итак, мои конечные точки представления должны возвращать модель, которая переведена на JavaScript, и у меня должны быть конечные точки json, которые возвращают обновленную версию этой модели? Что я могу сделать для устранения дублирования кода? Я в этом случае? –

1

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

Но я также думаю, что это действительно зависит от типа страницы, которую вы загружаете. Если ваше приложение в основном основано на AJAX (модель стиля SPA), то первая загрузка, вероятно, не так важна, потому что это происходит только один раз, и, вероятно, это нормально, что потребуется немного дополнительного времени. Это несколько проще и более согласованно, чтобы все ваши данные загружались в один конец либо через AJAX, либо через традиционную манипуляцию View. И когда ваш код на стороне клиента требует, чтобы вы повторно загрузили весь набор данных для списка или записи, вы не закончите дублирование логики шаблона/представления для генерации этого вывода.