配置、建立Controller
路由
现在我们在管道中间就是使用了路由中间件,这个**中间件就可以检查在应用中注册的这些端点,**这些端点有可能是被MVC这个框架注册的,也有可能是RAZOR PAGE或者SINGLE IR或其他给注册的。
这个时候这个中间件就会判断进来的http请求,它是在哪个端点上出现的。
判断在哪个端点上出现的之后呢,这是个重要信息。这样就可以让后面的中间件知道这个信息。
而如果后续的中间件需要知道这条重要的信息的话,那么这些中间件也可以知道这些端点是谁注册的。
因为我们MVC这个应用,肯定需要使用html,javascript、CSS等这些静态文件,所以我需要使用UseStaticFiles这个中间件,这样我们的Web文件就可以摄入这些静态文件了。不使用这个中间件,静态文件根本从客户端访问不到。
创建wwwroot文件夹,这个文件夹下面都是静态资源,我们创建images文件夹,同时放进一个图片
通过运行程序,输入网址。
之所以能看到猫猫头图片,是因为我们使用了app.UseStaticFiles();这个中间件
包管理
我们的Web应用呢,通常分为前端和后端
服务器端(后端):Nuget
服务器端就是我们ASP.NET Core写C#代码这块,这块我们使用Nuget
前端:Npm
前端的一些UI库、CSS等这些库,使用Npm这个包管理工具
使用MVC相关技术
因为跟部门有一个多对一的关系,所以有一个外键
部门接口下我写了四个方法
然后再看一下实现
首先做一个list ,readonly private,里面是放了部门这个类型
然后在构造函数里面我添加了三个部门。
Employee的实现跟Department一样。
依然是先在构造函数里面添加一些员工。
写完类和接口以后,接下来要做的就是注册这两个服务
Controller
注册完服务之后,我们建立Controller
public DepartmentController(),()里面我们需要IDepartmentService它的实现类,所以我把接口注入一下就可以了
这就是构造函数注入
注入之后呢,给它赋给一个本地的只读的变量。
下面我们建立async,默认的路由就是Index.
public async Task<IActionResult> Index()
{
ViewBag.Title = "Department Index";
var departments = _departmentService.GetAll();
return View(departments);
}
[HttpGet]
public IActionResult Add()
{
ViewBag.Title = "Add Department";
return View(new Department());
}
[HttpPost]
public async Task<IActionResult> Add(Department model)
{
if(ModelState.IsValid)
{
await _departmentService.Add(model);
}
return RedirectToActionResult(nameof(Index));
使用ViewBag这个属性,再使用Title这个属。
第二个action的作用,我是想让他跳转页面,所以它不是异步的
表单提交都应该使用HttpPost 默认不写的话就会使用[HttpGet]
public async Task<IActionResult> Add(Department model)
这个model进来之后,我们得判断这个model属性填没填,判断一下它的是否合法。
在MVC里呢,我们使用ModelState.IsValid可以判断这个model是否是合法的。同时,在传参数的时候已经对他有了一个验证,并且把验证结果放在if里面了。如果合法,我们就可以通过Service进行添加的操作。最后返回列表页面。
写字符串也可以,但是写nameof有利于重构(重命名)
接下来我们再写EmployeeController,别忘了也要继承Controller类
这个Controller里,我注入了两个Service,下面还是那几个方法。
public class EmployeeController : ControllerBase
{
private readonly IDepartmentService _departmentService;
private readonly IEmployeeService _employeeService;
public EmployeeController(IDepartmentService departmentService,IEmployeeService employeeService)
{
_departmentService = departmentService;
_employeeService = employeeService;
}
public async Task<IActionResult> Index(int deaprtmentId)
{
var department = await _departmentService.GetById(deaprtmentId);
ViewBag.Title = $"Employees of {department.Name}";
ViewBag.DepartmentId = departmentId;
var employees = await _employeeService.GetByDepartmentId(departmentId);
return View(employees);
}
Index呢,因为我要展现这个部门下的所有员工,所以需要传一个参数departmentId
var department = await _departmentService.GetById(deaprtmentId);
通过deaprtmentId,通过_departmentService获得这个部门,
ViewBag.Title = $"Employees of {department.Name}";
然后设一下这个标题,说它是哪个部门的
ViewBag.DepartmentId = departmentId;
然后再设另外一个变量叫做departmentId(我们前台的view可能会用到)
var employees = await _employeeService.GetByDepartmentId(departmentId);
return View(employees);
再就是我通过我通过departmentId,通过_employeeService,把它下面的所有员工全部取出来,并传到这个View里面。
第二个方法是添加,添加也是针对某个部门的员工进行添加。
public IActionResult Add(int departmentId)
{
ViewBag.Title = "Add Employee";
return View(new Employee
{
departmentId = departmentId
});
}
也就是需要把departmentId传进来,然后返回一个Model到页面,页面的Model呢设好了departmentId。
在表单提交之后,会走接下来的Add方法,把新员工传进来,然后判断一下这个Model是否都是合法的,
合法的话我们就会执行
await _employeeService.Add(model)
这个方法
然后返回到员工列表页面,页面呢需要一个参数,所以说得写这个方法的第二个参数,我们就需要把departmentId给传进来
return RedirectToAction(nameof(Index), new { departmentId = model.DepartmentId })