我正在开发ASP.net MVC。在这里,M代表" Model" 。可以映射到数据库的模型。
通常,我强烈地将我的视图与模型绑定。
但是,最近我听说View Model不仅仅是模型。
ViewModel是MVC
还是MVVM
(ModelViewViewModel)的一部分?
ViewModel和Model之间的基本区别是什么。我想举一个小例子来说明我在MVC中的工作方式:
我的观点:
<% using (Ajax.BeginForm("TestAjax", "Reviewer", new AjaxOptions { OnSuccess = "Callback", OnFailure = "Failed" }))
{ %>
<table align="center">
<tr>
<td class="tdCol1Align">
<label>
Number1</label>
</td>
<td class="tdCol2Align">
<%=Html.TextBoxFor(Model => Model.number1)%>
</td>
</tr>
<tr>
<td class="tdCol1Align">
<label>
Number2</label>
</td>
<td class="tdCol2Align">
<%=Html.TextBoxFor(Model => Model.number2)%>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="Add" class="button" />
</td>
</tr>
</table>
<%
}
%>
我的模特:
public class AddModel
{
public int number1
{
get;
set;
}
public int number2
{
get;
set;
}
}
最后我的控制器:
[HttpPost]
public JsonResult TestAjax(AddModel model)
{
int iSum = model.number1 + model.number2;
return Json(new { Sum = iSum });
}
那就是它。我无法理解这个ViewModel
进入图片的位置
请在以下内容中澄清:
1. ViewModel和Model
之间的基本区别2.查看MVC或MVVM架构的模型部分?
如何使用ViewModels实现上述示例?
如果视图模型是MVC的一部分,那么它们将在应用程序的文件夹结构中的哪个位置?
答案 0 :(得分:4)
ViewModel是MVC或MVVM(ModelViewViewModel)的一部分吗?
ViewModel是MVC中的M.
ViewModel和Model之间的基本区别是什么。
可以映射到数据库的模型不是MVC中的M.这是域或业务模型。您应该从控制器操作传递给视图的是视图模型。单个视图模型可以是多个域模型的组合。
我无法理解这个ViewModel进入图片的位置
在此示例中,视图模型是您在此处创建的匿名类型:
return Json(new { Sum = iSum });
基本上它是一个名为Sum
的单个属性的类。如果你定义一个实际的视图模型而不是使用匿名类型,可能会更清楚:
public class ResultViewModel
{
public int Sum { get; set; }
}
您的控制器操作可能已传递到视图:
[HttpPost]
public JsonResult TestAjax(AddModel model)
{
int iSum = model.number1 + model.number2;
ResultViewModel viewModel = new ResultViewModel();
viewModel.Sum = iSum;
return Json(viewModel);
}
但是因为在这种情况下没有实际的视图但是JSON结果,使用匿名类型就好了。
答案 1 :(得分:1)
MVC的视图模型与MVVM的视图模型不同。
对于MVC,视图模型是一种特定于一个或多个视图的模型。我们通常称之为“模型”的是实体,您的业务层和数据访问层也使用这些实体。但很多时候,它们不适合向用户显示数据,因为视图可能有特定的需求。您可能需要组合多个实体,进行一些转换,然后创建仅包含所需数据的视图模型。视图应该有一个视图模型,数据准备好显示,它不应该进行额外的过程。
答案 2 :(得分:1)
MVC中的Model不仅仅是一个表示数据库中一个(或多个)表的类(POCO)。它是一层。它包含应用程序的所有业务,验证和数据访问逻辑。它还包含域模型,它们代表数据库表。
当您的应用程序增长并且您需要更多灵活性和复杂视图时,域模型通常不适合在视图中使用它。特别是当您添加与数据库验证不同的验证属性时,或者您的视图包含多个域模型的属性时。举一个登录视图,你不想在这里使用User
域模型,而是一个专门的视图模型,它只包含视图所需的属性:
public class LoginModel
{
[Required]
public string Username { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
public bool RememberMe { get; set; }
}
答案 3 :(得分:1)
简单的解释是
模型:它的定义可以为数据库中的读取值定义属性(就像数据访问层一样)
查看模型:已定义为您可以定义reade写入值到View(UI)的属性(就像业务逻辑层一样)
修改强>
如果您使用MVVM模式,那么您将在解决方案资源管理器中手动创建一个名为ViewModel的文件夹,但如果您使用了MVC模式,那么模型将在解决方案资源管理器中自动创建,
Model文件夹具有与数据库相关的类(包括一些用于读取和写入数据库到数据库的方法),View Model具有我们的业务逻辑和UI相关类(包括一些用于读取和写入视图值的属性,用于视图(UI),和View有我们的HTML或任何页面在MVVM模式
模型具有数据库类以及业务逻辑和UI相关类,而View具有我们的html或任何页面在MVC模式中