MVC中Controller与Views的关系

时间:2017-12-20 10:04:31

标签: asp.net asp.net-mvc

MVC Relationship

我是MVC和ASP.NET的初学者,我查看了很多关于模型,视图和控制器之间关系的文章。当我尝试做一些Web示例项目时,我发现View和Controller之间的关系对我很困惑。

从上图中,如果我们想要从控制器更新视图,那么我们需要操纵模型来更新视图。

但是如果我想传递一些简单的数据或消息在View上显示怎么办?然后我必须为它建立一个模型?我听说过Viewbag,但这不是一个好的方法,也不安全传递数据?

2 个答案:

答案 0 :(得分:0)

我通常使用ViewBag,因为它们对于传递简单数据非常有用。

如果要传递更复杂的数据,可能需要创建模型或编辑当前模型。

例如:

<tr id="pesquisa">
  <td>
    Nome: @Html.TextBox("nome", ViewBag.nome as string, new { @class = "form-control" })
  </td>
  <td>
    NIF: @Html.TextBox("nif", ViewBag.nif as string, new { @class = "form-control" })
  </td>
  <td>
    Contacto: @Html.TextBox("contacto", ViewBag.contacto as string, new { @class = "form-control" })
  </td>
  <td>
    Email: @Html.TextBox("email", ViewBag.email as string, new { @class = "form-control" })
  </td>
  <td>
    <br />
    <input type="submit" value="Pesquisar" align="center" class="btn btn-info" />
  </td>
</tr>

在这里,我使用ViewBag来保存搜索完成后用户在搜索区域中键入的字符串,并重新加载页面。

我希望有帮助:)

答案 1 :(得分:0)

免责声明 :我认为这个问题与旧问题基本相同:您应该使用动态类型还是静态类型?双方都有很多支持者。我个人更喜欢静态打字,除非有充分的理由去动态打字。

我认为有些混淆来自于“模型”一词实际上可能会根据具体情况引用不同的事物:

  1. 模型作为一般MVC模式中的角色
  2. 模型作为ASP.NET MVC实现中的角色
  3. 域名模型
  4. 如果从与实现无关的MVC模式的角度来看ASP.NET MVC实现,那么ModelViewBag / ViewDataTempData一起表示“MVC模型”(即从MVC控制器传递到MVC视图的一段数据)。但是出于实际原因,ASP.NET MVC的设计者决定将单个逻辑MVC模型拆分为不同的物理实体。因此,技术上修改ViewBag / ViewData也在修改MVC模型。作为静态类型检查的支持者,我更喜欢使用显式模型类来使用ViewBag / ViewData。恕我直言,这提供了更好的(类型)安全性,并使代码更容易阅读:显式模型类成为视图和控制器之间的契约。

    请注意,“域模型”可能并且通常可能与ASP.NET模型对象不同。如果您的应用程序很简单,可以将所有逻辑放入ASP.NET控制器并使用ASP.NET模型作为域模型。但是,随着您的应用程序变得更加复杂,您可能希望将业务逻辑从ASP.NET控制器移到某些服务以便更好地重用。然后你可能会得到像MVC-inside-MVC这样的东西:你有一个业务级MVC,其中M是域模型,C是域逻辑服务,V - 表示为整个ASP.NET MVC堆栈;然后在ASP.NET MVC中你有自己的模型,视图和控制器。在这样的设计下,ASP.NET控制器变得非常薄。它映射来自HTTP的用户输入;调用一些域级服务,它执行所有逻辑并返回一些域模型;然后ASP.NET控制器将该域模型映射到其自己的模型,可能会添加一些特定于视图的字段并呈现视图。