asp.net mvc-一些关于控制器如何处理C#中的HTTP请求的说明

本文关键字:处理 中的 HTTP 说明 请求 何处理 mvc- net 控制器 asp | 更新日期: 2023-09-27 17:50:05

我是C#的新手,我不太喜欢MVC(我来自Java(

我有以下疑虑:

我有一个名为Controllers的控制器包''文件夹(我不知道Visual Studio中的propper名称(,其中包含处理传入HTTP请求的控制器。

因此,在这个文件夹中,我有一个类似于的TestController.cs

namespace MyWebApplication.Controllers
{
    public class AndreaController : MyBaseController
    {
        // Manager che effettua la connessione ed ottiene i dati da visualizzare nella view:
        private MaliciousCodeManager manager = new MaliciousCodeManager("DefaultConnection");

        //
        // GET: /Test/
        /* Method that handle the HTTP REQUEST toward /Test/index
         * 
         */
        public ActionResult Index(DataModel.MaliciousCode.SearchMalicious model)
        {
            Debug.WriteLine("*** FILTRI DI RICERCA ***");
            ...................................................
            ...................................................
            ...................................................
            DO SOME STUFF
            ...................................................
            ...................................................
            ...................................................
        }
}

因此,在我看来,这个控制器处理向/Test/路径的请求

因此Index((方法处理对/Test/Index的请求我认为这对我来说很清楚

现在我的怀疑与传递给我的Index方法的参数有关:

public ActionResult Index(DataModel.MaliciousCode.SearchMalicious model)

因此,此方法的输入参数醚是一个DataModel.MaliciousCode.SearchMalicious模型对象。

当我在调试模式下执行代码时,在调用Index((方法来处理HTTP请求之前,它会创建一个SearchMalicious恶意对象作为参数传递

所以我的疑问是:它是从框架中自动创建的吗?还是怎样我错过了什么?

TnxAndrea

asp.net mvc-一些关于控制器如何处理C#中的HTTP请求的说明

在这种情况下,您将指定索引所需的类型。。。对象被创建,然后用户发布值或查询字符串参数被简单地映射到它上。唯一的要求是该类型定义了一个无参数构造函数,这样框架就可以创建它。

在这种情况下,用户无法控制正在创建的类型,只能控制映射到它的值。因此,理论上,如果你在构造函数中定义了一个用恶意代码定义的类,你可以用这种方式调用它,但这取决于开发人员,而不是最终用户。

在模型绑定方面需要注意的是,框架不知道应该映射哪些值。因此,如果你显示的页面有一个模型类型的用户,并允许某人更新他们的电子邮件,理论上他们可以覆盖他们的折扣,假设它在同一个对象上,并且他们知道房产名称。

是的,您的模型会自动绑定。将参数传递给方法告诉MVC您想要模型绑定。如果不希望模型绑定,则传递一个空参数。如果你想控制这是如何完成的,你可以创建一个自定义模型绑定器,并将其添加到global.asax.中的模型绑定器列表中

顺便说一下,你做了很多假设。索引不一定是默认操作,它取决于路由的设置方式。路径/Test也不一定是使用的,但在默认路由条件下它是正确的。

实际上只有控制器类型名称在请求路由中很重要。可能有人重命名了类型,但忘记重命名文件。通过查看您的代码,Index方法将回答http://example.org/Andrea和http://example.org/Andrea/IndexURL。Index是默认路由中的默认动作名称。

如果您查看您的路由配置(应在App_Start/RouteConfig.cs或Global.asax.cs中(,您将看到默认的路由注册。

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

此命令告诉ASP.NET MVC,URL的第一段指定控制器类型,第二段告诉操作方法名称。操作方法是控制器中的公共方法,可以根据这些规则从URL调用。它们的返回类型通常是ActionResult。控制器是为操作方法提供逻辑容器的类型。

ASP.NET中的模型绑定尝试从URL段、查询字符串和发布的表单值中获取值。请注意默认路由中的最后一段:它告诉ASP.NETMVC在提供时从URL的第三段创建一个名为id的路由值。所以当我向http://example.org/Home/Index/3,我可以在我的操作方法中获得绑定到我的参数值的值3

public class HomeController : MyBaseController
{
    public ActionResult Index(int id)
    {
        //id is 3
    }
}

在复杂的模型类型(如您的模型类型(中,绑定将查找如上所述的每个属性值。以下是SearchMalicious类型的示例:

public class SearchMalicious 
{
    public string Keyword { get; set; }
    public string OrderBy { get; set; }
}

当您向http://example.org/Andrea?keyword=abc&orderby=def,模型绑定将创建SearchMalicious实例,并使用querystring值填充这些属性。此外,这个模型可以从POST请求中的表单字段中填充。