MVC4 - 视图和控制器之间的关系

时间:2013-12-19 14:55:38

标签: asp.net asp.net-mvc asp.net-mvc-4

我很难在.NET中掌握MVC的概念。我正在创建一个基本的博客应用程序,主要是为了获得MVC的洞察力和技能。我只是没有得到一些。我目前还不清楚的部分是Controller和View之间的关系。如果有人能回答我的话,那就明白了这件事。

我有一个名为TestA的View,它对应于我的Controller ControllerTestA。现在我在ControllerTestA中添加了以下内容。

public ActionResult TestA (){ //do something }

现在我需要知道来自ViewA的任何形式的所有回发是否都必须通过我的TestA Controller方法。基本上我可以根据不同的原因使用不同的参数进行不同的回发。一些用于一个回发,另一些用于另一个。这是怎么做的?

在这里会有一些帮助。

3 个答案:

答案 0 :(得分:4)

你错过了这里关系的一个关键部分,即路由。您使用 Postback 等术语来表达WebForms;不这样做是因为你最终会让自己感到困惑。

考虑MVC的最佳方式是请求响应

让我们看看如何在MVC应用程序中发生请求(高级别)。

请求

  1. 请求使用url ex命中服务器。 /你好/世界
  2. 该网址用于匹配路由表中的所有条目
  3. 找到匹配项后,该路由会定义基本值,例如应该调用 controller action
  4. 创建控制器,并使用路由值和其他请求属性(查询字符串,会话等)调用该操作。
  5. 响应

    1. 我们现在处于控制器操作中,运行完成请求所需的代码
    2. 将数据传递给View
    3. 视图由惯例和 ViewEngine
    4. 决定
    5. 然后呈现视图并将其写入响应。
    6. 请求/响应已完成。
    7. 注意

      整个过程由路径决定,控制器和视图之间的关系是微不足道的。发布到表单的位置由您在视图中通过使用帮助程序方法确定,这些方法可确定在下一个请求/响应流程中点击的路径

      一些助手方法。

      @Url.Action("index", "home");
      @Html.ActionLink("index", "home")
      @using (Html.BeginForm("create", "home")) { }
      

      总结一下,控制器动作和视图之间的关系确实很方便你的路线。一旦掌握了如何创建它们,您就会更好地理解如何管理应用程序的交互。希望有所帮助。 :)

答案 1 :(得分:2)

MVC中没有“Postback”这样的东西。与WebForms相比,视图仅呈现将HTML发送到浏览器。一旦浏览器发出任何类型的请求,它就会转到控制器,而不是视图。

至于关系:

  • 如果您定义TestAController(注意:不是“ControllerTestA”),它会提供“/ TestA / *”网址。如果你有一个方法TestA,它将提供“/ TestA / TestA”。
  • 如果您的方法返回View(someModel),它将在文件夹TestA.cshtml中查找名为TestA.aspx / Views\TestA的视图,其名称与您的方法类似(命名为您的控制器,没有“控制器”后缀)
  • 视图将根据控制器传递的someModel呈现HTML。
  • 在视图中,您可以调用其他网址或将数据发布到某些网址。这会关闭圈子。

对于参数或重载,有一些限制:

  • 您可以为GET与POST以及PUT与DELETE定义重载。您需要使用相应的属性注释方法。
  • 但是,对于具有不同参数集的POST,您无法为同一方法名称定义多个重载。您需要制作POST方法签名,以便可以或不可以将参数发送到服务器:

示例:

public ActionResult TestA(
    string someOptionalParameter, int? someOtherOptionalParam)
{
    if (string.IsNullOrEmpty(someOptionalParameter)) { ... }
    if (someOtherOptionalParam == null) { ... }
}

如果未将参数发布到服务器,模型映射器会将参数设置为null

就像Khalid已经提到的那样 - 你不应该混淆MVC和WebForms的概念。他们是非常不同的。 MVC没有可以发布到服务器的“视图状态”。它没有类似WebForm的ASPX(或CSHTML)页面生命周期。

答案 2 :(得分:1)

如果您在视图中有表单,那么该表单会有一个要发布到的网址。此URL位于视图中的Html.BeginForm方法中。

然后,表格将发布到审批控制器中的相应控制器方法

所以如果BeginForm像这样开始:

  

使用(Html.BeginForm(“AddProduct”,“Product”

然后将调用控制器Product(ProductController是类名)中的action方法“AddProduct”。