繁体   English   中英

关于控制器如何在C#中处理HTTP请求的一些说明?

[英]Some clarification about how a controller handle an HTTP Request in C#?

我在C#中绝对是新的,我不是很喜欢MVC(我来自Java)

我有以下疑惑:

我有一个控制器包\\文件夹(我不知道Visual Studio中的propper名称)名为Controllers ,它包含处理传入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 / path的请求

所以Index()方法处理对/ Test / index的请求我认为这对我来说非常清楚

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

public ActionResult Index(DataModel.MaliciousCode.SearchMalicious model)

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

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

所以我的疑问是:它是从框架自动创建的吗? 或者是什么? 我错过了什么?

Tnx Andrea

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

在这种情况下,用户无法控制正在创建的类型,只有映射到它的值。 所以是的,从理论上讲,如果你在构造函数中有一个用恶意代码定义的类,你可以这样称呼它 - 但这是在开发人员而不是最终用户。

您在模型绑定时必须小心的是框架不知道应该映射哪些值。 因此,如果您显示的页面具有模型类型的用户并允许某人更新他们的电子邮件,理论上他们可以覆盖他们的折扣,假设它在同一个对象上并且他们知道属性名称。

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

作为旁注,你做了很多假设。 索引不一定是默认操作,它取决于您的路由设置方式。 路径/测试不一定是使用的路径,但它在默认路由条件下是正确的。

实际上,只有控制器类型名称在请求路由中很重要。 可能有人重命名了该类型但忘记重命名该文件。 通过查看您的代码,该Index方法将回答http://example.org/Andreahttp://example.org/Andrea/Index网址。 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.NET MVC在提供时从URL的第三个段创建一个名为id的路由值。 因此,当我向http://example.org/Home/Index/3提出请求时,我可以在我的action方法中将值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实例并使用查询字符串值填充这些属性。 此模型也可以从POST请求中的表单字段填充。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM