欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC5基础-控制器(Controller)详解

程序员文章站 2022-06-14 19:07:52
在上文ASP.NET MVC5基础 – MVC文件架构中我们简单了解了下控制器Controller的作用,本文我将详细介绍控制器Controller的使用方法。 Controller的运行过程 上文我们已经讲到,控制器负责响应浏览器传送过来的所有请求。在MVC中,每一个浏览器请求都映射到一个控制器( ......

在上文asp.net mvc5基础 – mvc文件架构中我们简单了解了下控制器controller的作用,本文我将详细介绍控制器controller的使用方法。

controller的运行过程

上文我们已经讲到,控制器负责响应浏览器传送过来的所有请求。在mvc中,每一个浏览器请求都映射到一个控制器(controller)中,每个请求都会有个动作(action),只要动作存在,就可以通过该动作方法接收客户端传来的请求与决定响应的视图(view)。

我们以之前创建的mvc项目为例,打开项目的index.cshtml页面。

显示的界面如下:

可以看到,页面的地址栏url为:http://localhost:61515/home/index

根据路由规则,home是控制器(controller)名,index是动作(action)名。所以这个url调用的是homecontroller控制器下的index方法。

在index方法中,只有这么一行代码:return view();,表示返回视图,然后返回给浏览器的是views/home文件夹下的index.cshtml页面。

虽然我们在index方法中没有指定返回哪个页面,但根据asp.net mvc的约定规则,控制器会找到views文件夹中,与controller名称相同文件夹下的同一方法名的页面。所以返回的是home下的index.cshtml页面。具体的有关控制器返回view的内容下文会详细说明。

控制器的运行过程大体如上,从浏览器请求到控制器返回结果的整体流程为:

ASP.NET MVC5基础-控制器(Controller)详解

controller请求参数处理

试想一下,我们在浏览器地址栏经常能看到url后面接很多个参数,比如百度搜索:https://www.baidu.com/s?ie=utf-8&wd=梦中的aoede 在url后面接了ie和wd两个参数,那么这种参数在mvc中是怎样获取的呢?

举个例子,我们给首页链接增加两个参数:http://localhost:61515/home/index?name=梦中的aoede&age=18

那么在index方法中,正常情况我们可以通过request.querystring获取到这两个参数。如下:

public actionresult index()
{
    var name = request.querystring["name"];
    var age = request.querystring["age"];
    return content($"name:{name},age:{age}");
}

打开http://localhost:61515/home/index?name=梦中的aoede&age=18,显示如下:

其实在mvc中,参数的传递是通过模型绑定(model binding)机制从requestcontext中获取到参数数据的。获取到数据之后再将数据传入到方法的参数中,所以我们只需要在方法中增加两个参数即可,如下:

public actionresult index(string name,int age)
{
    return content($"name:{name},age:{age}");
}

打开页面输出结果还是一样的:


相同的,如果浏览器通过post方式传过来一个表单,那么我们也可以在index参数中使用表单对应的model实体类来接收。在此我就不赘述了。

controller返回值说明

action处理完请求后,会将结果返回给客户端。action返回的结果我们称为动作结果(action result)。

所有的动作结果都继承自actionresult基类,以homecontroller中的index方法为例,它return的view()就是一个viewresult类,viewresult类也是actionresult的子类。

asp.net mvc框架支持六种标准类型的动作结果:

动作名称

概述

方法名

viewresult

视图内容,html或标记

view

emptyresult

空内容

 

redirectresult

重定向到新的url

redirect

redirecttorouteresult

重定向到新的控制器

redirecttoaction/redirecttoroute

jsonresult

返回一个json(javascript object notation)内容

json

contentresult

返回文本内容

content

需要注意的是,虽然控制器返回的是动作结果(action result),但在代码中,我们调用的是controller基类中的方法。在上文的表中有对应的方法名。

除了以上六种动作结果以外,你还可以给action方法返回其他类型的返回值,这个返回值会自动被包装在contentresult中。比如这段代码:

public class homecontroller : controlle
{
    public datetime index()
    {
        return datetime.now;
    }
}

index返回的是datetime对象,而在浏览器中,显示的是一个日期字符串。

mvc过滤器

过滤器在mvc中也是个非常重要的概念,本文仅简单介绍下什么是过滤器,详细的内容我会在后续文章中深入说明。

过滤器(filters)就是向请求处理管道中注入额外的逻辑。

过滤器有不同类型,mvc支持的过滤器有:授权(authorization)、行为(action)、结果(result)和异常(四种),不同类型有不同的作用。

我们以授权(authorization)为例简单说明下。比如我们有个方法,只有登录用户才可以调用,那么我们只需要添加一个验证用户是否登录的授权过滤器,在对应的方法上方添加此过滤器的标记即可。

总结

通过本文可以了解到,controller的运行过程,controller中action如何获取参数、以及action的返回值类型等内容。

更多内容可访问我的个人博客: