2012-03-11 4 views
6

Я смотрел на образец Контакты редактора на сайте knockout.js:нужно передать исходные данные ViewModel из ASP.NET MVC в knockout.js

http://knockoutjs.com/examples/contactsEditor.html

образец отлично работает, но мне нужно для внесения в него двух изменений:

  • Передача исходных данных из метода действия контроллера ASP.NET MVC 3. Вот код с сервера:

Классы

Пример кода на стороне контроллера

 List<Phone> phoneList = new List<Phone>(); 

     Person p1 = new Person() 
     { 
      FirstName = "Abc", 
      LastName = "Xyz" 
     }; 

     Phone phone1 = new Phone() 
     { 
      Type = "Home", 
      Number = "1111111111" 
     }; 
     Phone phone2 = new Phone() 
     { 
      Type = "Mobile", 
      Number = "1111111112" 
     }; 

     phoneList.Add(phone1); 
     phoneList.Add(phone2); 

     p1.Phones = phoneList; 

     List<Phone> phoneList2 = new List<Phone>(); 

     Person p2 = new Person() 
     { 
      FirstName = "Pqr", 
      LastName = "Stu" 
     }; 

     Phone phone3 = new Phone() 
     { 
      Type = "Home", 
      Number = "1111111113" 
     }; 
     Phone phone4 = new Phone() 
     { 
      Type = "Mobile", 
      Number = "1111111114" 
     }; 

     phoneList2.Add(phone3); 
     phoneList2.Add(phone4); 

     p2.Phones = phoneList2; 

     people.Add(p1); 
     people.Add(p2); 

     ViewBag.InitialData = Json(people, JsonRequestBehavior.AllowGet); 
  • Помимо рядов контактов, которые являются частью ViewModel , Мне также необходимо передать некоторые данные (например, ContactListName и ContactListOwner), которые не выполняются 't относится к строкам контактов, но к самому виду ViewModel. Эти свойства будут показаны вне сетки контактов.

Я бы очень признателен, если кто-то может мне помочь.

+0

что делает 'ViewBag.InitialData' содержит вы можете опубликовать код контроллера? вы намерены использовать 'ViewBag.InitialData' в' ko.applyBindings (new ContactsModel (initialData)); '? – Rafay

+0

Спасибо @ 3nigma за ваш ответ. Я добавил код контроллера в свой вопрос. И да, я намерен использовать ViewBag.InitialData в ko.applyBindings (new ContactsModel (initialData)), если это возможно. – Yasir

ответ

5

Метод Json, который вы вызываете в своем контроллере, предназначен для возврата JsonResult, он не создает строку JSON. Вы должны использовать этот метод для возврата json из вызова ajax.

Чтобы вернуть строку JSON в представление, используйте что-то вроде этого.

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
ViewBag.InitialData = serializer.Serialize(people); 

Затем в представлении кода

<script> 
    var initialData = '@Html.Raw(ViewBag.InitialData)'; 
    .... 
</script> 

Чтобы ответить на ваш второй вопрос. Для того, чтобы передать список глобальных данных, таких как это просто определить новый класс ContactsList например

public class ContactsList 
{ 
    public string Name { get;set; } 
    public string Owner { get;set; } 
    public IList<People> People { get;set; } 
} 

Заполняем это и передать это JavascriptSerializer вместо. Вам, очевидно, необходимо будет настроить ваш js ContactsModel соответственно.

EDIT

Вот jsfiddle, который демонстрирует необходимые изменения.

http://jsfiddle.net/madcapnmckay/jRjwU/

Надеется, что это помогает.

+0

Это то, что я делаю, и я называю этот класс ContactsViewModel вместо ContactList. Представления привязываются к классам ViewModel вместо Model. – Raj

+0

Спасибо @madcapnmckay за ваш ответ. Я попробовал код, который вы указали, но он добавляет десятки и десятки пустых строк вместо двух строк, которые я передаю в своей сумке. Я что-то упускаю? – Yasir

+0

Кроме того, я не называю какой-либо метод ajax для начальной загрузки данных. Разве это имеет значение? Я устанавливаю ViewBag.InitialData в методе действия Index() моего контроллера. Этот метод используется для визуализации представления в первый раз. – Yasir

2

насколько первая часть вопроса касается, вы можете попробовать

<script> 
    var initialData = '@Html.Raw(ViewBag.InitialData)'; //get the raw json 
    var parsedJSON = $.parseJSON(initialData); //parse the json client side 
    ko.applyBindings(new ContactsModel(parsedJSON)); 

</script> 

вторую часть я действительно не понял ...

+0

Спасибо @ 3nigma за код для первой части. Оно работает. Я отредактировал описание второй части вопроса. Надеюсь, теперь это ясно. – Yasir

+0

Получил вторую часть, которая также работала, основываясь на ответе @ madcapnmckay. Спасибо за вашу помощь. – Yasir

5

Вы также можете использовать модель вместо ViewBag:

Контроллер:

 public ActionResult Index() 
     { 
      var data= GetYourDataFromSomewhere(); 

      return View(data); 
     } 

Вид:

@model IEnumerable<ModelName> 

....

<script type="text/javascript"> 
    $(document).ready(function() { 

     var dataForKO = new KOViewModel(@Html.Raw(Json.Encode(Model))); 
Смежные вопросы