2013-05-06 1 views
0

У меня было приложение WPF, где я использовал ObservableCollection для обновления/изменения/добавления в представление из viewModel с помощью привязки.Альтернатива наблюдаемому коллекционированию в asp.net mvc

Теперь им имеющий дополнительное требование для создания веб-приложений с использованием ASP.NET MVC

Есть ли альтернатива ObservableCollection в ASP.NET MVC? не

Если да, то дать хороший пример с JQuery и бритвой двигателя (asp.net MVC) ..

ответ

2

Нет там нет. Дело в том, что события не используются в этом смысле в веб-разработке. Вероятно, самым близким к наблюдаемым коллекциям будет запрос списков в JSON с сервера с ajax и рендеринг данных клиентов. С некоторым умным использованием дженериков, отражений и некоторого javascript вы могли бы превратить этот код в более динамичный.

Простой пример:

Контроллер:

public JsonResult GetPersons() 
{ 
     var list = new List<string> { "Jake", "Jenny", "Joe" }; 
     return Json(list, JsonRequestBehavior.AllowGet); 
} 

Html:

<ul id='personlist'></ul> 

Jquery:

$.getJSON('@Url.Action("GetPersons", "MyController")',null, 
      function (data) { 
       // iterate each person from the requested data 
       $.each(data, function (i, p) { 
        // render each person as li 
        $("#personlist").append('<li>'+p+'</li>'); 
       }); 
      }); 

Другой, не столь динамичным решением было бы просто запрашивающее мнение , usin g Viewmodel со списком лиц в нем.

public class PersonsViewModel 
{ 
    public List<string> Persons { get; set; } 

    public PersonsViewModel(List<string> persons) 
    { 
     Persons = persons; 
    } 
} 

public ActionResult Persons() 
{ 
     var list = new List<string> { "Jake", "Jenny", "Joe" }; 
     return View(new PersonsViewModel(list)); 
} 

Вид:

<ul> 
    @foreach (var item in Model.Persons) 
    { 
     <li>@item.ToString()</li> 
    } 
</ul> 

Если вы новичок в ASP.NET MVC и делал WPF/Winforms перед моим кончик, чтобы забыть все, что вы знали о событиях.

1

Прежде всего, прочитайте sormii ответ: жизненный цикл веб-приложения не подходит для такого рода событий. Вы не можете обновить что-либо на сервере (код контроллера или Razor) и ожидать обновления на стороне клиента (HTML) без кругового путешествия.

Как и sormii, использование вызовов Ajax - это способ продолжения. Если вам нравится шаблон MVVM и способ работы ObservableCollection, взгляните на knockoutjs. С knockoutjs вы можете объявить javascript viewmodel (не путайте с ASP-моделью asp.net mvc на стороне сервера), которая содержит все данные, которые отображаются в вашем представлении. Эта модель просмотра может быть обновлена ​​(используя код javascript и вызовы ajax), а knockoutjs обновит DOM, чтобы обновить значения.

Это небольшой пример того, как будет объявлен Javascript ViewModel:

var ViewModel = function() { 
    this.items = ko.observableArray(); 
    this.items.push({name: 'foo', lastName: 'bar'}); 
}; 
var vm = new ViewModel(); 
ko.applyBindings(vm); 

Нокаут ViewModels просто JavaScript объекты с некоторыми из их свойств, заявленных в качестве ko.observableArray или ko.observable (ko.observableArray карт ObservableCollection и ko.observable отображает свойство, которое вызывает событие PropertyChanged). Тогда вы должны сказать Knockout, как связать это ViewModel до DOM элементов (например, с помощью скрепляющего элемента в WPF и DataTemplate):

<li data-bind="foreach: items"> 
    <ul data-bind="text: name" /> 
</li> 

When Ко.applyBindings вызывается, нокаут будет создавать элемент <li> элемента foreach в свойствах элементов нашей модели. Когда элементы выталкиваются или удаляются из свойства элементов, нокаут автоматически обновляет список.

Посмотрите на веб-страницу knockoutjs, так как есть много образцов и руководств.

Смежные вопросы