C# Asp.net(MVC)和WPF(MVVM)的比较——是否存在等效的数据绑定?

C# Asp.net(MVC)和WPF(MVVM)的比较——是否存在等效的数据绑定?,c#,asp.net,asp.net-mvc,wpf,mvvm,C#,Asp.net,Asp.net Mvc,Wpf,Mvvm,我正在考虑从WPF mvvm过渡到asp.net MVC。我认为,为了理智起见,对asp.netMVC和WPFMVVM进行比较可能是有用的 以下WPF示例的MVC等价物是什么样子的?具体地说,我很好奇UI和应用程序逻辑的分离是如何保持的,也许更重要的是,是否有数据绑定等价物。两种不同的设计模式如何实现相同的场景 视图模型 在视图模型中,您将拥有一个类,其中视图中的组件也将绑定在该类中。有点像: namespace solution.ViewModels { public class Ma

我正在考虑从WPF mvvm过渡到asp.net MVC。我认为,为了理智起见,对asp.netMVC和WPFMVVM进行比较可能是有用的

以下WPF示例的MVC等价物是什么样子的?具体地说,我很好奇UI和应用程序逻辑的分离是如何保持的,也许更重要的是,是否有数据绑定等价物。两种不同的设计模式如何实现相同的场景

视图模型

在视图模型中,您将拥有一个类,其中视图中的组件也将绑定在该类中。有点像:

namespace solution.ViewModels
{
    public class MainViewModel : BaseViewModel
    {
        private DateTime _fromDate;

        public DateTime FromDate
        {
            get { return _fromDate; }
            set { _fromDate = value; OnPropertyChanged("FromDate"); }
        }

        private DateTime _toDate;

        public DateTime ToDate
        {
            get { return _toDate; }
            set { _toDate = value; OnPropertyChanged("ToDate");}
        }
    }
}
其中BaseViewModel为:

public class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
看法

不,不,不,还有…不

WPF在客户端运行,一切都在客户端发生。它将所有状态和数据保存在同一台机器的内存中

另一方面,MVC在客户端和服务器端都运行,其中服务器不存储您可以阅读的关于HTTP无状态的更多状态,并且客户端/服务器不共享相同的内存或数据

因此,这些是针对完全不同的用例的完全不同的技术

另一方面,Classic ASP试图模拟您使用post back描述的行为。基本上,它是将所有用户的操作发送回服务器,服务器可以相应地进行操作,如更改值、禁用按钮等

我不建议再使用它了,因为它会给服务器带来很多不必要的压力

WPF在客户端运行,一切都在客户端发生。它将所有状态和数据保存在同一台机器的内存中

另一方面,MVC在客户端和服务器端都运行,其中服务器不存储您可以阅读的关于HTTP无状态的更多状态,并且客户端/服务器不共享相同的内存或数据

因此,这些是针对完全不同的用例的完全不同的技术

另一方面,Classic ASP试图模拟您使用post back描述的行为。基本上,它是将所有用户的操作发送回服务器,服务器可以相应地进行操作,如更改值、禁用按钮等


我不建议再使用它了,因为它给服务器带来了很多不必要的压力

我认为目前关于这个问题的一些评论有点不公平……是的,ASP.Net MVC和WPF这两种技术用于为完全不同的平台构建,但是,可以在每个平台中使用的体系结构MVC和MVVM之间进行比较

在WPF中,您有一个ViewModel,它向您的视图公开您的模型。在您的示例中,MainViewModel通过FromDate和ToDate属性公开包含from和to日期的模型。然后,视图可以选择显示这些值

在ASP.NETMVC中,您仍然有一个模型和一个视图,以及一些连接这两者的东西—a控制器。由某个HTTP请求在控制器上调用的操作负责填充要由视图呈现并作为HTTP响应返回给客户端的模型

public class MainController : Controller
{
  public ActionResult ShowMeTheModel()
  {
    SimpleModel model = new SimpleModel
    {
      FromDate = DateTime.Today,
      ToDate = DateTime.Today.AddDays(7)
    };

    return View(model);
  }

  [HttpPost]
  public ActionResult UpdateTheModel(SimpleModel model)
  {
    // use the model parameter to persist changes or otherwise        

    return Redirect("ShowMeAllTheModels");
  }
}
以及基本观点

<h2>A Simple Model</h2>

<% using(Html.BeginForm("UpdateTheModel", "Main")) %>
<% { %>

  <table>
    <tr>
      <th>From Date</th>
      <th>To Date</th>
    </tr>
    <tr>
      <td>
        <%= Html.DatePickerFor(model => model.FromDate) %>
      </td>
      <td>
        <%= Html.DatePickerFor(model => model.ToDate) %>
      </td>
    </tr>
  </table>
<% } %>
数据绑定发生在post back-put中非常简单,带有SimpleModel类型参数的[HttpPost]操作将使用HTTP post中包含的值填充该模型。然后,该操作可以使用该模型中的值来持久化更改或触发某些操作


是的,平台是非常不同的,你需要充分意识到这些差异,但是,正如我在上文中所概述的那样,确实可以进行一些比较。

我认为目前关于这个问题的一些评论有点不公平……是的,ASP.Net MVC和WPF这两种技术用于为完全不同的平台构建,但是,可以在每个平台中使用的体系结构MVC和MVVM之间进行比较

在WPF中,您有一个ViewModel,它向您的视图公开您的模型。在您的示例中,MainViewModel通过FromDate和ToDate属性公开包含from和to日期的模型。然后,视图可以选择显示这些值

在ASP.NETMVC中,您仍然有一个模型和一个视图,以及一些连接这两者的东西—a控制器。由某个HTTP请求在控制器上调用的操作负责填充要由视图呈现并作为HTTP响应返回给客户端的模型

public class MainController : Controller
{
  public ActionResult ShowMeTheModel()
  {
    SimpleModel model = new SimpleModel
    {
      FromDate = DateTime.Today,
      ToDate = DateTime.Today.AddDays(7)
    };

    return View(model);
  }

  [HttpPost]
  public ActionResult UpdateTheModel(SimpleModel model)
  {
    // use the model parameter to persist changes or otherwise        

    return Redirect("ShowMeAllTheModels");
  }
}
以及基本观点

<h2>A Simple Model</h2>

<% using(Html.BeginForm("UpdateTheModel", "Main")) %>
<% { %>

  <table>
    <tr>
      <th>From Date</th>
      <th>To Date</th>
    </tr>
    <tr>
      <td>
        <%= Html.DatePickerFor(model => model.FromDate) %>
      </td>
      <td>
        <%= Html.DatePickerFor(model => model.ToDate) %>
      </td>
    </tr>
  </table>
<% } %>
数据绑定发生在post back-put中非常简单,带有SimpleModel类型参数的[HttpPost]操作将使用HTTP post中包含的值填充该模型。然后,该操作可以使用该模型中的值来持久化更改或触发某些操作

所以,是的,平台是非常不同的,你需要

完全意识到这些差异,但正如我上面所述,肯定可以进行比较。

比较MVC web应用程序和WPF桌面应用程序就像比较苹果和汽车一样。不要错误地尝试移植它。忘记你迄今为止所做的一切,从零开始。这是公平的,也是我最终的想法。仍然希望就不同的设计模式如何实现相同的目标展开讨论。我建议您看看这是一个使用MVVM模式开发Javascript UI的框架。我自己也这么做,这两种模式之间唯一的相似之处是,在严重依赖ajax请求来处理用户在UI中所做事情的网页中,使用@MartinoBordin提到的类似于knockoutjs的javascript MVVM非常有益。就像WPF中的绑定一样,它们会为您处理所有复杂的UI javascript更新。将MVC web应用程序与WPF桌面应用程序进行比较就像将苹果与汽车进行比较一样。不要错误地尝试移植它。忘记你迄今为止所做的一切,从零开始。这是公平的,也是我最终的想法。仍然希望就不同的设计模式如何实现相同的目标展开讨论。我建议您看看这是一个使用MVVM模式开发Javascript UI的框架。我自己也这么做,这两种模式之间唯一的相似之处是,在严重依赖ajax请求来处理用户在UI中所做事情的网页中,使用@MartinoBordin提到的类似于knockoutjs的javascript MVVM非常有益。他们为您处理所有那些复杂的UI javascript更新,就像WPF中的绑定一样。好的,谢谢Steve。我感谢你的意见。我还学到了很多。不确定是否有mvc方式在控制器中初始化模型,设置值,然后将任何值传递给视图。然后,当视图中的某些内容发生更改时,以另一种方式返回。听起来我会做很多JavaScript。如果服务器需要在用户点击submit之前知道用户的选择何时更改,那么很可能是您做错了。在某些情况下,这可能是有效的,例如,您只希望在请求时加载某些内容,在这种情况下,您可以查看API调用。但请记住HTTP@steve,如果您需要实时SPA,您可以在服务器中使用mvvm、viewmodel以及带有html和Javascript的视图。这里有一些框架。好的,谢谢你,史蒂夫。我感谢你的意见。我还学到了很多。不确定是否有mvc方式在控制器中初始化模型,设置值,然后将任何值传递给视图。然后,当视图中的某些内容发生更改时,以另一种方式返回。听起来我会做很多JavaScript。如果服务器需要在用户点击submit之前知道用户的选择何时更改,那么很可能是您做错了。在某些情况下,这可能是有效的,例如,您只希望在请求时加载某些内容,在这种情况下,您可以查看API调用。但请记住HTTP@steve,如果您需要实时SPA,您可以在服务器中使用mvvm、viewmodel以及带有html和Javascript的视图。这里有一些框架,感谢Simon花时间做比较。这无疑有助于我从WPF/MVVM的角度理解MVC。这是不完整的。客户端MVVM框架对于更多地利用ajax而不是回发的应用程序来说是常见的。您只是介绍了服务器端,这一点很重要,但是……感谢Simon花时间进行比较。这无疑有助于我从WPF/MVVM的角度理解MVC。这是不完整的。客户端MVVM框架对于更多地利用ajax而不是回发的应用程序来说是常见的。您只是介绍了服务器端,这一点很重要,但是。。。。