我是MVC和ASP.NET的初学者,我查看了很多关于模型,视图和控制器之间关系的文章。当我尝试做一些Web示例项目时,我发现View和Controller之间的关系对我很困惑。
从上图中,如果我们想要从控制器更新视图,那么我们需要操纵模型来更新视图。
但是如果我想传递一些简单的数据或消息在View上显示怎么办?然后我必须为它建立一个模型?我听说过Viewbag,但这不是一个好的方法,也不安全传递数据?
答案 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)
免责声明 :我认为这个问题与旧问题基本相同:您应该使用动态类型还是静态类型?双方都有很多支持者。我个人更喜欢静态打字,除非有充分的理由去动态打字。
我认为有些混淆来自于“模型”一词实际上可能会根据具体情况引用不同的事物:
如果从与实现无关的MVC模式的角度来看ASP.NET MVC实现,那么Model
,ViewBag
/ ViewData
和TempData
一起表示“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控制器将该域模型映射到其自己的模型,可能会添加一些特定于视图的字段并呈现视图。