Передача ViewModel для backbone.js со стороны сервера MVC3 - PullRequest
1 голос
/ 17 ноября 2011

В ASP.NET MVC есть Модель, Представление и Контроллер.

МОДЕЛЬ представляет сущности, которые хранятся в базе данных и, по сути, представляют собой все данные, используемые в приложении (например, сгенерированные EntityFramework, «БД».Первый «подход».

Не все данные из модели, которые вы хотите показать в представлении (например, хэши паролей).Таким образом, вы создаете МОДЕЛЬ ПРОСМОТРА, каждый для каждого строго типизированного вида бритвы, который у вас есть в приложении.Например:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MyProject.ViewModels.SomeController.SomeAction
{
    public class ViewModel
    {
        public ViewModel()
        {
            Entities1 = new List<ViewEntity1>();
            Entities2 = new List<ViewEntity2>();
        }

        public List<ViewEntity1> Entities1 { get; set; }
        public List<ViewEntity2> Entities2 { get; set; }

    }

    public class ViewEntity1
    {
        //some properties from original DB-entity you want to show
    }
    public class ViewEntity2
    {

    }
}

Когда вы создаете сложные клиентские интерфейсы (я это делаю), вы используете какой-то шаблон для javascript на клиенте, MVC или MVVM (я знаю только эти).Итак, с MVC на клиенте у вас есть другая модель (например, Backbone.Model), которая является третьей моделью в приложении.Это немного много.

Почему мы не используем ту же модель ViewModel на клиенте (в backbone.js или другом фреймворке)?Есть ли способ перевести CS-кодированную модель в JS-кодированную?Как в шаблоне MVVM, с knockout.js , когда вы можете сделать это следующим образом:

в SomeAction.cshtml:

<div style="display: none;" id="view_model">@Json.Encode(Model)</div>

после этого в Javascript-коде

var ViewModel = ko.mapping.fromJSON($("#view_model").get(0).innerHTML);

теперь вы можете расширить вашу ViewModel некоторыми действиями, обработчиками событий и т. Д .:

ko.utils.extend(ViewModel, {

some_function: function () {
//some code
}

});

Итак, мы не строим ту же модель представления наклиент снова, мы переносим существующую модель представления с сервера.По крайней мере, data.

Но knockout.js мне не подходит, с ним нельзя построить сложный интерфейс, это просто привязка данных.Мне нужно что-то более структурное, например backbone.js.

Единственный способ построить ViewModel для backbone.js, который я сейчас вижу, это переписать ту же ViewModel в JS с сервера руками.

Есть ли способы перенести его с сервера?Чтобы повторно использовать одну и ту же модель представления в представлении сервера и представлении клиента?

1 Ответ

4 голосов
/ 17 ноября 2011

Если ваш ViewModel может быть преобразован один в один в Backbone.js Model, то вы можете просто сериализовать ваш ViewModel в JSON и вернуть его в результате запроса модели Backbone.js. Таким образом, в модели JavaScript вы указываете URL для действия ASP.NET MVC

Person = Backbone.Model.extend({

  url: function() {
    return this.isNew() ? '/Users/Create' : '/Users/' + this.get('id');
  }

});

В ASP.NET MVC вы пишете что-то вроде этого:

var data = somedata;
var viewModel = new ViewModel();
var serializer = new JavaScriptSerializer();
viewModel.JsonData = serializer.Serialize(data);

return View("viewname", viewModel);

затем используйте

<%= Model.JsonData %>

Удачного кодирования!

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