无法理解ViewModel和Models之间的区别

时间:2013-10-25 11:27:16

标签: c# asp.net-mvc model viewmodel

我正在开发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架构的模型部分?

  1. 如何使用ViewModels实现上述示例?

  2. 如果视图模型是MVC的一部分,那么它们将在应用程序的文件夹结构中的哪个位置?

4 个答案:

答案 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模式中