MVC中控制器和视图之间的关系
我是MVC和ASP.NET的初学者,我查看了很多关于模型,视图和控制器之间关系的文章。 当我试图做一些web示例项目时,我发现View和Controller之间的关系对我来说很困惑。
从上面的图片中,如果我们想从控制器更新视图,那么我们需要操纵模型来更新视图。
但是如果我想传递一些简单的数据或消息以显示在View上呢? 那我必须为它建立一个模型? 我听说过Viewbag,但它传递数据不是一个好方法或安全吗?
我通常使用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
来保存搜索完成后用户在“搜索”区域中键入的字符串,并重新加载页面。
我希望帮助:)
免责声明 :我认为这个问题基本上和老问题一样:你应该使用动态类型还是静态类型? 双方都有很多支持者。 就个人而言,我更喜欢静态打字,除非有很好的理由去动态打字。
我认为有些混淆来自于这样一个事实,即“模型”一词实际上可能会根据上下文引用不同的事物:
如果从实现不可知的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控制器将该域模型映射到它自己的模型中,可能会添加一些特定于视图的字段并呈现该视图。
上一篇: Relation among the Controller and Views in MVC
下一篇: how does asp.net mvc relate a view to a controller action?