Asp.net(MVC)和WPF(MVVM)的比较 - 数据绑定是否相等?

时间:2017-02-15 21:58:04

标签: c# asp.net asp.net-mvc wpf mvvm

我正在考虑从WPF(mvvm)转换到asp.net(MVC)。我认为为了理智而绘制asp.net(MVC)和WPF(MVVM)的失败比较可能是有用的。

以下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));
        }
    }
}

查看

<Window .......>
    <Grid>
       <DatePicker SelectedDate = "{Binding ToDate}">
       <DatePicker SelectedDate = "{Binding FromDate}">
    </Grid>
</Window>

2 个答案:

答案 0 :(得分:5)

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

在WPF中,您有一个 ViewModel ,它将模型公开给您的视图。在您的示例中,MainViewModel通过FromDateToDate属性公开包含from和a date的模型。然后,视图可以选择随意显示这些值。

在ASP.Net MVC中,您仍然拥有模型视图以及连接两者的东西 - Controller 。某些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>
<% } %>

数据绑定发生在帖子后面 - 很简单,带有[HttpPost]类型参数的SimpleModel操作将使用HTTP帖子中包含的值填充该模型。然后,该操作可以使用该模型中的值来持久更改或触发某些操作。

所以是的,平台是非常不同的,你需要充分意识到这些差异,但肯定会有如上所述的比较。

答案 1 :(得分:1)

不,不,不......不

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

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

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

另一方面,经典ASP正在尝试使用回发来模拟您描述的行为。基本上它将所有用户的操作发送回服务器,服务器可以相应地动作(例如更改值,禁用按钮等)。

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