我正在考虑从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>
答案 0 :(得分:5)
我认为到目前为止对这个问题的一些评论有点不公平......是的,这两种技术(ASP.Net MVC和WPF)用于构建完全不同的平台,但是可以进行比较在每个平台中使用的体系结构(MVC和MVVM)之间。
在WPF中,您有一个 ViewModel ,它将模型公开给您的视图。在您的示例中,MainViewModel
通过FromDate
和ToDate
属性公开包含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正在尝试使用回发来模拟您描述的行为。基本上它将所有用户的操作发送回服务器,服务器可以相应地动作(例如更改值,禁用按钮等)。
我不建议再使用它了,因为它给服务器带来了很多不必要的压力