C# Asp.net(MVC)和WPF(MVVM)的比较——是否存在等效的数据绑定?
我正在考虑从WPF mvvm过渡到asp.net MVC。我认为,为了理智起见,对asp.netMVC和WPFMVVM进行比较可能是有用的 以下WPF示例的MVC等价物是什么样子的?具体地说,我很好奇UI和应用程序逻辑的分离是如何保持的,也许更重要的是,是否有数据绑定等价物。两种不同的设计模式如何实现相同的场景 视图模型 在视图模型中,您将拥有一个类,其中视图中的组件也将绑定在该类中。有点像: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
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而不是回发的应用程序来说是常见的。您只是介绍了服务器端,这一点很重要,但是。。。。