替代asp.net mvc中的observablecollection

时间:2013-05-06 09:32:47

标签: jquery asp.net-mvc razor observablecollection

我有一个WPF应用程序,我使用ObservableCollection在viewModel的帮助下刷新/更改/添加到视图。

现在我还需要使用asp.net mvc创建一个Web应用程序

asp.net mvc中是否有ObservableCollection的替代方法?

如果是这样,请用jquery和razor引擎(asp.net mvc)给出一个很好的例子..

2 个答案:

答案 0 :(得分:2)

不,没有。事情是在Web开发中没有使用事件。可能与可观察集合最接近的是使用ajax从服务器请求JSON中的列表并在客户端呈现该数据。通过巧妙地使用泛型,反射和一些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>');
                });
            });

另一个不那么动态的解决方案是使用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 :(得分:1)

首先阅读sormii回答:Web应用程序的生命周期不适合此类事件。您无法更新服务器上的内容(控制器或Razor代码),并且希望在客户端(HTML)刷新而不进行往返。

正如sormii建议使用Ajax调用是继续进行的。如果您喜欢MVVM模式以及ObservableCollection的工作方式,请查看knockoutjs。使用knockoutjs,您可以声明一个javascript视图模型(不要与服务器端的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);

Knockout viewmodels只是javascript对象,其中一些属性声明为ko.observableArray或ko.observable(ko.observableArray映射ObservableCollection,ko.observable映射一个引发PropertyChanged事件的属性)。 然后你需要告诉Knockout如何将这个viewmodel绑定到DOM元素(比如在WPF和DataTemplate中使用Binding元素):

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

当调用ko.applyBindings时,Knockout将在viewmodel的items属性中创建一个<li>元素foreach项。当从项目中推送或删除项目时,敲除将自动更新列表。

请查看knockoutjs网页,因为有很多示例和教程。