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

Asp.net MVC4-视图和控制器之间的关系,asp.net,asp.net-mvc,asp.net-mvc-4,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我很难理解.NET中MVC的概念。我正在创建一个基本的博客应用程序,主要是为了获得MVC的洞察力和技能。我只是有些不太明白。我目前不清楚的部分是控制器和视图之间的关系。如果有人回答我这个问题,事情就会明朗了 我有一个名为TestA的视图,它对应于我的控制器TestA。现在我在ControllerTestA中添加了以下内容 public ActionResult TestA (){ //do something } 现在,我需要知道,从视图TestA以任何形式发布的所有回发是否都必须通过我的Te

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

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

public ActionResult TestA (){ //do something }
现在,我需要知道,从视图TestA以任何形式发布的所有回发是否都必须通过我的TestA控制器方法。所以本质上,我可以有不同的回发,因为不同的原因使用不同的参数。一些用于一次回发,另一些用于另一次回发。是这样做的吗


希望您能在此获得帮助。

如果您在视图中有一个表单,则该表单有一个url,它将发布到该url。此URL位于视图中的Html.BeginForm方法中

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

因此,如果BeginForm是这样开始的:

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


然后,将调用控制器产品(ProductController是类名)中的操作方法“AddProduct”。

此处缺少关系的一个关键部分,即路由。您使用类似于Postback的术语以WebForms的形式发言;不要这样做,因为您最终会混淆自己

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

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

要求
  • 请求通过url ex./hello/world点击服务器
  • 该url用于匹配路由表中的任何条目
  • 当找到匹配项时,该路由定义了基本值,比如应该调用什么控制器和操作
  • 创建控制器,并使用路由值和其他请求属性(querystring、session等)调用该操作
  • 回应
  • 我们现在在控制器操作中,运行满足请求所需的代码
  • 将数据传递给视图
  • 视图由约定和视图引擎决定
  • 然后呈现视图并将其写入响应
  • 请求/响应已完成
  • 注 整个过程由路由决定,控制器和视图之间的关系无关紧要。表单发布到何处由您在视图中通过使用辅助方法来确定下一个请求/响应流中要点击的路由

    一些辅助方法

    @Url.Action("index", "home");
    @Html.ActionLink("index", "home")
    @using (Html.BeginForm("create", "home")) { }
    
    总而言之,控制器操作和视图之间的关系实际上是通过路由来实现的。一旦您掌握了如何创建它们,那么您将更好地理解如何管理应用程序的交互。希望这能有所帮助。:

    没有“回发”这样的事情在MVC中。与WebForms不同,视图只呈现要发送到浏览器的HTML。一旦浏览器发出任何类型的请求,它就会发送到控制器,而不是视图

    至于关系:

    • 如果您定义一个
      TestAController
      (注意:不是“controlleresta”),它将服务于“/TestA/*”URL。如果您在其中有一个方法
      TestA
      ,它将服务于“/TestA/TestA”
    • 如果您的方法返回
      View(someModel)
      ,它将在文件夹
      Views\TestA
      中查找名为
      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


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

    这是我所做的,似乎工作正常。我不想修改URL,我希望它是相同的。
    public ActionResult TestA(int-id,string-title){ViewData[“id”]=id;return View(_-repository);}[HttpPost]public ActionResult TestA(string-username){if(ModelState.IsValid){return RedirectToAction(“TestA”);}return View();}
    所以我让这段代码正常工作,但感觉就像你说的那样。我想我是在用不同的参数重载POST请求。但它仍然有效。@user303695:我想说的是,你可以重载该方法,并拥有一个GET和一个POST版本(就像你所做的那样),但您不能有两个相同方法的POST重载-这是否回答了您的问题“本质上,我可以使用不同的参数进行不同的回发,原因不同。一些用于一个回发,而另一些用于另一个回发”@user3036965:在“侧线”上-您将存储库传递给视图。这会给人一种印象,即您的视图可能会做很多事情,而您的控制器只是将请求转发给