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

时间:2014-03-12 18:00:10

标签: c# asp.net-mvc

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

我有以下疑问:

我有一个名为控制器的控制器包\文件夹(我不知道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 恶意对象作为参数传递

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

TNX 安德烈

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

实际上,只有控制器类型名称在请求路由中很重要。可能有人重命名了该类型但忘记重命名该文件。通过查看您的代码,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发出请求时,我可以在我的操作方法中将值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请求中的表单字段填充。