ASP.NET Core 如何使用Mvc相关技术建立Controller、Tag Helper (下)
上篇文章介绍了通过定义两个接口和服务类,分别实现这两个接口,并且进行了一个服务的注册。
今天就来建立Controller

接下来就是在控制器中通过构造函数的方式注入接口(见代码块6行)
代码块2行的意思是在构造函数中注入之后,赋值给一个本地只读的变量。
从代码块11行往后就是建立acttion了,一个是做部门查询用的Index方法,一个是做新增部门用的Add方法。并且两种方法都是返回Task<T>。然后第一个Add()方法不需要异步,因为它只做页面的跳转带个new Model也就是新的Department给下面的Add()做方法添加就好了。注意:真正的新增部门数据提交动作是在HttpPost下完成的
DepartmentController控制器:
public class DepartmentController : Controller
{
private readonly IDepartmentService _departmentService; //构造函数注入
public DepartmentController(IDepartmentService departmentService)
{
_departmentService = departmentService; }
public async Task<IActionResult> Index()
{
ViewBag.Title = "Department Index";
var departments =await _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 RedirectToAction(nameof(Index));
}
}
好了,DepartmentController写完了。接下来就是EmployeeController的建立的。方法总体上和部门控制器基本上类似。。
还是一样注入了两个服务,因为员工表相对于部门表是多对1的关系,在新增员工表示也要相应的带上部门表的相关数据,所以这里注册了两个服务。同样的也是通过构造函数的方式去注入。
首先Index方法是要列出某个部门下面的所有员工所以需要传个部门Id作为参数
Add()方法也是添加某个部门的员工,所有也需要带部门Id作为参数去新增员工数据
Fire()方法是解雇员工,通过员工Id来解雇所有需要员工Id
public class EmployeeController:Controller
{
private readonly IDepartmentService _departmentService;
private readonly IEmployeeService _employeeService;
public EmployeeController(IDepartmentService departmentService,IEmployeeService employeeService)
{
_departmentService = departmentService;
_employeeService = employeeService;
}
public async Task<IActionResult> Index(int departmentId)
{
var department = await _departmentService.GetById(departmentId);
ViewBag.Title = $"Employees of {department.Name}";
ViewBag.DepartmentId = departmentId;
var employees = await _employeeService.GetByDepartmentId(departmentId);
return View(employees);
}
//根据部门添加员工
public IActionResult Add(int departmentId)
{
ViewBag.Title = "Add Employee";
return View(new Employee
{
DepartmentId=departmentId
});
}
[HttpPost]
public async Task<IActionResult> Add(Employee model)
{
if (ModelState.IsValid)
{
await _employeeService.Add(model);
}
return RedirectToAction(nameof(Index), new { departmentId = model.DepartmentId });
}
public async Task<IActionResult> Fire(int employeeId)
{
var employee = await _employeeService.Fire(employeeId);
return RedirectToAction(nameof(Index), new { departmentId = employee.DepartmentId });
}
}
以上两个Controller都建立好了。
接下来就是建立View了。先建立一个Views文件夹,然后建立Shard文件夹做为存放布局页(_Layout.cshtml)的文件夹(学过Mvc一个都清除布局页作用)

第二步就是建立_ViewStart页面,它的作用就是针对所有的页面都母页面(_Layout)

这两个页面建好之后来看看里面的内容。
_Layout:
asp-append-version:Tag Helper语法,作用见注释。这样做看起来是比较友好的,之前Mvc有HtmlHelper不过不太友好已经被淘汰了。这里就介绍Tag Helper。asp-append-version实际上后边对应了一个C#的类所以说功能还是很强大的。
<!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-2">
@* Tag Helper asp-append-version防止图片缓存*@
<img asp-append-version="true" src="~/images/1.jpg" style="height:60px;" />
</div>
<div class="col-md-10">
<span class="h2">@ViewBag.Title</span>
</div>
</div>
<div class="row">
<div class="col-md-12">
@RenderBody()
</div>
</div>
</div>
</body>
</html>
如果我们需要全局启用内置的Tag Helper的话,我们就在Views文件夹下建立一个_ViewImports.cshtml视图。

这里面写的代码会自动添加到其他View里面,实际上就是添加了一个程序集。如果你不想全局启用这个Tag Helper,就可以把下面这句话添加到具体的View里面。
@* 配置全局 TagHelper *@
@addTagHelper "*,Microsoft.AspNetCore.Mvc.TagHelpers"
之前介绍了开发的时候可能是分一些环境,比如开发环境,生产环境,这个时候呢我们的代码是不一样的。而我们的Razor里面就可以区分一下这个环境。
include表示在某个环境下是有效的,如果我们开发环境是Development,运行的时候我们的代码就会走到指定的环境中。asp-href-include和asp-href-exclude也是Tag Helper语法,前者表示
在布局页中:
<head>
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title</title>
@* Razor区分开发环境 如果开发环境是Development就执行以下区域*@
<environment include="Development">
@* 使用css文件,不使用压缩文件 *@
<link rel="stylesheet" asp-href-include="css/*" asp-href-exclude="css/all.min.css" />
</environment> @* 除了开发环境的模式执行以下区域 *@
<environment exclude="Development">
<link asp-href-include="css/all.min.css" rel="stylesheet" />
</environment>
</head>
ASP.NET Core 如何使用Mvc相关技术建立Controller、Tag Helper (下)的更多相关文章
- ASP.Net Core 2.2 MVC入门到基本使用系列 (二)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- ASP.Net Core 2.2 MVC入门到基本使用系列 (三)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- ASP.NET Core 2.0 MVC项目实战
一.前言 毕业后入职现在的公司快有一个月了,公司主要的产品用的是C/S架构,再加上自己现在还在学习维护很老的delphi项目,还是有很多不情愿的.之前实习时主要是做.NET的B/S架构的项目,主要还是 ...
- ASP.NET Core Restful Web API 相关资源索引
GraphQL 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(上) 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(下) [视频] 使用ASP.NET C ...
- ASP.NET CORE 1.0 MVC API 文档用 SWASHBUCKLE SWAGGER实现
from:https://damienbod.com/2015/12/13/asp-net-5-mvc-6-api-documentation-using-swagger/ 代码生成工具: https ...
- ASP.Net Core 2.2 MVC入门到基本使用系列 (一)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- ASP.Net Core 2.2 MVC入门到基本使用系列 (四)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- asp.net core 3.0 MVC JSON 全局配置
asp.net core 3.0 MVC JSON 全局配置 System.Text.Json(default) startup配置代码如下: using System.Text.Encodings. ...
- 在 Asp.Net Core 中安装 MVC
在 ASP.NET Core 中安装 MVC 到目前为止,我们在本系列视频中使用的 ASP.NET Core 项目是使用“空”项目模板生成的.目前这个项目没有设置和安装 MVC. 两个步骤学会在 AS ...
随机推荐
- 了解一下mock
1.mock简介: mock测试就是在测试过程中,对于某些不容易构成或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法,mock是在测试过程中,对于一些不容易构造/获取的对象,创建一个mo ...
- 通过Java HTTP连接将网络图片下载到本地
通过Java HTTP连接将网络图片下载到本地 只知道浏览器使用的是HTTP协议,那么如何将网络资源使用JavaHTTP下载下来呢! 这只是一个非常简单的小示例,只是不想每次碰到关于此方面的内容忘 ...
- Java类锁和对象锁实践和内部私有锁关联
Java类锁和对象锁实践 感谢[jiehao]同学的投稿,投稿可将文章发送到tengfei@ifeve.com 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明. 一.相关约定 为 ...
- Java学习成长第一集
由于最近所在项目组的项目临近结尾,所以有时间对自己近来的学习做个总结.不得不说,程序员不学习就退步这句话是真的很让人信服!自己入行将近一年的时间,所学的就是Java开发的专业,很羞愧的是现在的自己能力 ...
- GeiGebra指令
- 【转】解决存储过程执行快,但C#程序调用执行慢的问题
这两天遇到一个问题令人比较郁闷,一个大概120行左右的存储过程在SQL Server2012的查询分析器里面执行,速度非常理想,1秒不到,即可筛选抓取到大概500条数据记录.但在C#程序代码里调用,就 ...
- Python爬虫某招聘网站的岗位信息
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:阿尔法游戏 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...
- Treasure Island DFS +存图
All of us love treasures, right? That's why young Vasya is heading for a Treasure Island. Treasure I ...
- C++枚举算法
枚举算法 什么是枚举? 枚举,顾名思义,就是用最笨的方法,去解决问题(暴力枚举),一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数.这两种类型经常(但不总是)重叠. 枚举 ...
- 5. git 过滤,让某文件夹里无法提交新添加的文件
. gitignore 向此文件里添加文件路径就行了.如( web/core/ ) 此时git status将看不到添加的文件或文件夹了