控制器
这一系列笔记都基于视频:视频地址
- 一个类以
Controller
结尾,或者加上[Controller]
(不用以Controller结尾)标注的类就被识别为一个控制器 - 一个控制器一般都会继承一个Controller类,在Controller类中有许多对象,可以方便我们操作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
public class TestController : Controller
{
public IActionResult Index()
{
return Content("hello world!");
}
}
}
利用Controller中自带对象获取数据
- Controller类里面自带Request对象,用来获取请求参数,包括Session、Cookies等
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
public class TestController : Controller
{
public IActionResult Index()
{
// 表单
var value1 = Request.Form["value1"];
// 请求参数
var value2 = Request.Query["value2"];
// 获取Cookies
var value3 = Request.Cookies["value3"];
// 获取Session对象
var session = HttpContext.Session;
// 对session的操作
session.SetString("name", "value");
var name = session.GetString("name");
session.Remove("name");
return Content("hello world!");
}
}
}
- Session的其他方法:
namespace Microsoft.AspNetCore.Http
{
public static class SessionExtensions
{
public static byte[] Get(this ISession session, string key);
public static int? GetInt32(this ISession session, string key);
public static string GetString(this ISession session, string key);
public static void SetInt32(this ISession session, string key, int value);
public static void SetString(this ISession session, string key, string value);
}
}
数据绑定
- 将要传递的参数绑定到方法参数上
- 函数参数名必须和传递过来的参数名字相同
- 可以是简单类型也可以是自定义类型(类)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
public class TestController : Controller
{
public IActionResult Index(string name,int age)
{
return Content($"name:{name} age:{age}");
//name: zhangsan age:18
}
}
}
注意
-
如果一个类以Controller结尾,但是不把他当做一个控制器的话,就在类上面加上
[NonController]
标注 -
同一个数据出现在多种数据源的话,可以在参数上面加上特性,例如:
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
public class TestController : Controller
{
// 丛查询字符串中获取
public IActionResult Index( [FromQuery] string name)
{
return Content(name);
}
}
}
- 并不是所有的数据都会自动绑定,所以有些需要绑定的数据要加上特性才能绑定
ActionResult
- 动作结果接口,具体实现有:
JsonResult
:返回JSON
结构数据,封装方法为Json(Object)
RedirectResult
:跳转到新地址,封装方法为Redirect(Url)
FileResult
:返回文件,封装方法为File()
ViewResult
:返回视图页面,封装方法为View()
ContentResult
:文本内容,封装方法为Content("")
例如:
请求:https://localhost:5001/Test/returnjson1
返回:{“username”:“zhangsan”,“age”:18}
请求:https://localhost:5001/Test/returnjson2
返回:{“username”:“xiaoming”,“age”:18}
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
public class TestController : Controller
{
public IActionResult ReturnJson1()
{
var jsonResult = new JsonResult(new { username = "zhangsan", age = 18 });
return jsonResult;
}
public IActionResult ReturnJson2()
{
return Json(new { username = "xiaoming", age = 18 });
}
}
}
- 返回视图的时候默认会从项目中的
Views
文件夹下的Controller
名称对应的文件夹下寻找视图,例如请求下面的控制器就会返回ShowView
视图:
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
public class TestController : Controller
{
// 在项目的Views目录下,新建一个Test目录,在Test目录下新建一个视图`ShowView.cshtml`
public IActionResult ShowView()
{
return View();
}
}
}
- 返回指定视图
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
public class TestController : Controller
{
// 在项目的Views目录下,新建一个Test目录,在Test目录下新建一个视图`AnotherView.cshtml`
public IActionResult ShowView()
{
return View("/Views/Test/AnotherView.cshtml");
}
}
}
- 注意在程序中如果有IO操作的话,使用
Task<IActionResult>
作为函数的返回值可以提高程序性能。
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
public class TestController : Controller
{
public async Task<IActionResult> Index()
{
return View("/Views/Test/AnotherView.cshtml");
}
}
}