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



我很难在.NET中理解MVC的概念。我正在创建一个基本的博客应用程序,主要是为了获得MVC的洞察力和技能。我只是不太明白。我目前不清楚的部分是控制器和视图之间的关系。如果有人能回答我这个问题,事情就会解决的。

我有一个名为TestA的视图,它对应于我的控制器ControllerTestA。现在,我在ControllerTestA中添加了以下内容。

public ActionResult TestA (){ //do something }

现在,我需要知道我从视图TestA以任何形式回发的所有回发是否都必须通过我的TestA-Controller方法。因此,从本质上讲,由于不同的原因,我可以使用不同的参数进行不同的回发。其中一些用于一个回发,另一些用于另一个。是这样做的吗?

希望能在这里得到一些帮助。

这里缺少关系的关键部分,即路由。您使用的术语是WebForms,如Postback;不要那样做,因为你最终会弄糊涂自己。

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

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

请求

  1. 请求使用url ex./hello/world到达服务器
  2. 该url用于匹配路由表中的任何条目
  3. 当找到匹配时,该路由定义了基本值,如应调用控制器操作
  4. 创建控制器,并使用路由值和其他请求属性(querystring、session等)调用该操作

响应

  1. 我们现在正在进行控制器操作,运行您需要的代码来完成请求
  2. 将数据传递到视图
  3. 视图由约定和ViewEngine确定
  4. 然后将呈现视图并将其写入响应中
  5. 请求/响应已完成

注意

整个过程由路由决定,控制器和视图之间的关系是琐碎的。表单的投递位置由您在视图中使用辅助方法确定,该方法确定在下一个请求/响应流中要到达的路由

一些辅助方法。

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

综上所述,控制器操作和视图之间的关系确实通过您的路线而变得更加方便。一旦你掌握了如何创建它们,你就会更好地理解如何管理应用程序的交互。希望能有所帮助。:)

MVC中没有"Postback"这样的东西。与WebForms不同,视图只呈现要发送到浏览器的HTML。一旦浏览器发出任何类型的请求,它就会进入控制器,而不是视图。

关于关系:

  • 如果定义了TestAController(注意:不是"ControllerTestA"),它将提供"/TestA/*"URL。如果你有一个方法TestA,它将提供"/TestA/TestA">
  • 如果您的方法返回View(someModel),它将在文件夹ViewsTestA中查找名为TestA.cshtml/TestA.aspx的视图,该视图的名称与您的方法类似(与您的控制器类似,没有"controller"后缀)
  • 视图将基于控制器传递的someModel来呈现HTML
  • 在视图中,您可以调用其他URL或向某些人发布数据。这将闭合圆

至于参数或过载,有一些限制:

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

示例:

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

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

正如哈立德已经提到的,你不应该混淆MVC和WebForms的概念。他们非常不同。MVC没有可以发布到服务器的"视图状态"。对于ASPX(或CSHTML)页面,它没有类似WebForm的生命周期。

如果视图中有一个表单,则该表单有一个要发布到的url。该url位于视图中的Html.BeginForm方法中。

然后,表格将被张贴到相应的控制器方法和相应的控制器中

所以如果BeginForm是这样开始的:

使用(Html.BeginForm("AddProduct","Product">

然后将调用控制器Product(ProductController是类名)中的操作方法"AddProduct"。

最新更新