2013-05-06 64 views
0

我有一个WPF应用程序,在那里我使用ObservableCollection刷新/更改/添加到viewModel与视图的帮助下的绑定。asp.net中的observablecollection替代mvc

现在即时通讯有额外的要求,以创建使用asp.net的MVC

有没有替代的ObservableCollection在asp.net mvc的web应用程序?

如果是这样,给人以jQuery和剃刀引擎(asp.net的MVC)一个很好的例子..

回答

2

没有没有。事情是在Web开发中,事件不是用在这个意义上的。可能最接近可观察集合的是从服务器请求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答案:Web应用程序的生命周期并不适合这种事件。您无法更新服务器上的某些内容(控制器或Razor代码),并且希望在客户端(HTML)刷新而无需往返。

由于sormii建议使用Ajax调用是继续进行的方式。如果您喜欢MVVM模式和ObservableCollection的工作方式,请参阅knockoutjs。通过knockoutjs,你可以声明一个包含视图中显示的所有数据的JavaScript视图模型(不要与服务器端的asp.net mvc视图模型混淆)。这个视图模型可以更新(使用javascript代码和ajax调用),knockoutjs将更新DOM刷新值。

这是一个关于如何JavaScript的视图模型将宣布一个小例子:

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

淘汰赛的ViewModels只是一些声明ko.observableArray或ko.observable(ko.observableArray地图的ObservableCollection其属性的JavaScript对象和ko.observable映射引发PropertyChanged事件的属性)。 然后,你需要告诉淘汰赛如何将这个视图模型绑定到一个DOM元素(如使用WPF和DataTemplate中绑定元素):

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

当KO。applyBindings被调用,Knockout将在我们的viewmodel的items属性中创建一个<li>元素foreach项。当项目被推入或从项目属性中删除时,淘汰赛将自动更新列表。

看看knockoutjs网页,因为有很多样本和教程。