backbone.js заполняет большую вложенную модель из модели представления asp.net mvc - PullRequest
2 голосов
/ 26 февраля 2012

Хорошо, я знаю, что это длинный выстрел.

Я использую asp.net mvc на сервере. У меня будет действие, которое вернет json viewmodel, который будет иметь несколько простых свойств, а также объекты и коллекции объектов. Например

public class ViewModel
{
    public string Name {get;set;}
    public Person Person {get;set;}
    public IEnumerable<SleectListItem> UserTypes {get;set;}
}
public class Person
{
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public int UserType {get;set;}
}

a SelectListType - это просто пара имя-значение со свойствами «Текст» и «Значение» и «Выбранные»

Идея состоит в том, что существует форма, в которой вы можете создать человека, указав там имя, фамилию и выбрав тип пользователя из выпадающего списка.

Я хотел бы иметь набор моделей backbone.js, например

.
app.MyViewModel=Backbone.Model.extend();
app.Person=Backbone.Model.extend();
app.SelectListItem=Backbone.Model.Extend();
app.UserTypes=Backbone.Collection.Extend({
  model:app.SelectListType
})

и иметь возможность заполнять MyViewModel, передавая Json, возвращенный с сервера, который будет выглядеть примерно так

{Name:'SomeName',
 Person:{
     FirstName:'Frank',
     lastName:'Jones'
 },
 UserTypes:[{Text:'Admin',
       Value:1,
       selected:false},
      {text:'peon',
      Value:2,
      selected:false}

Это не традиционный способ, которым я знаю. Я предполагаю, что у меня должен быть один вызов для каждого объекта или чего-то еще, но я действительно хочу сделать только один вызов на сервер, чтобы получить все данные, которые мне нужны, так как они уже собираются и правильно размещаются на сервере.

Я мог бы написать всевозможные циклы для заполнения всех различных коллекций и т. Д. После получения данных, но нет ли более эффективного способа сделать это?

Ответы [ 2 ]

1 голос
/ 26 февраля 2012

Проверить Магистрально-реляционный :

Если вы настроите отношения, вы можете сделать что-то похожее на пример на этой странице:

paul = new Person({
id: 'person-1',
name: 'Paul',
user: { id: 'user-1', login: 'dude', email: 'me@gmail.com' }
});

// A User object is automatically created from the JSON; so 'login' returns 'dude'.
paul.get('user').get('login');

В противном случаеВы, вероятно, могли бы достичь желаемого, переопределив parse () и toJSON () в своей MyViewModel.

1 голос
/ 26 февраля 2012

На сервере:

public ActionResult Index()
{
    ViewModel model = ...
    return View(model);
}

и на клиенте:

@model ViewModel
<script type="text/javascript">
    var model = @Html.Raw(Json.Encode(Model));
    // TODO: the model variable here will represent the 
    // structure you are looking for so you can hook it
    // up with backbone
</script>

и если вы используете ASP.NET MVC 2 и механизм просмотра WebForms, где помощник Json.Encode недоступен, вы можете напрямую использовать класс JavaScriptSerializer :

<script type="text/javascript">
    var model = <%= new JavaScriptSerializer.Serialize(Model) %>;
    // TODO: the model variable here will represent the 
    // structure you are looking for so you can hook it
    // up with backbone
</script>
...