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 ...
随机推荐
- 10-jmeter 测试soap协议v1.2版本请求
1.因为jmeter安装了第三方插件jmeter-plugins-manager.jar之后(具体安装看之前文章),此时就可简单直接测试soap协议1.2版本的请求了 2. 3.进行运行线程就可实现了 ...
- Android 修改应用程序字体
在网上搜索了相关资料,研究了两种算是比较快速的改变程序字体的方法,好,先来介绍着两种方法. 首先第一种方法是重写控件(以Textview为例): 1.Android在写程序的时候谷歌早已将所有字体都默 ...
- 【Server】Windows系统安装Tomcat服务器
安装Tomcat服务器 Tomcat服务器地址:https://tomcat.apache.org/download-80.cgi 当前版本点选8以上版本,最新的可能不稳定,所以选8或者9版本 直接解 ...
- Java并发编程实战 02Java如何解决可见性和有序性问题
摘要 在上一篇文章当中,讲到了CPU缓存导致可见性.线程切换导致了原子性.编译优化导致了有序性问题.那么这篇文章就先解决其中的可见性和有序性问题,引出了今天的主角:Java内存模型(面试并发的时候会经 ...
- 怎么在执行Python脚本时,密码等敏感信息也不让它出现
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...
- G - Pairs Forming LCM LightOJ - 1236 (质因子分解)
题解:这道题要从n的角度来考虑i和j. n可以表示为n=a1^p1*a2^p2*a3^p3.......n=lcm(i,j),那么质因子a1^p1,a1可以在i或者j中,并且p1=max(a1i,a1 ...
- 高级数据结构---红黑树及其插入左旋右旋代码java实现
前面我们说到的二叉查找树,可以看到根结点是初始化之后就是固定了的,后续插入的数如果都比它大,或者都比它小,那么这个时候它就退化成了链表了,查询的时间复杂度就变成了O(n),而不是理想中O(logn), ...
- bash cookbook
目录 简介 变量 静态变量 变量操作 数组 应用 四则运算 条件测试 整数测试 文件测试 字符测试 组合条件测试 选择语句 循环语句 for--有限循环 while--无线循环 until conti ...
- tensorflow版线性回归
import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import tensorflow as tf def linearregression(): X ...
- Jmeter与LoadRunner的比较
一.与Loadrunner的比较相似点 1.Jmeter的架构跟loadrunner原理一样, 都是通过中间代理,监控&收集并发客户端发现的指令,把他们生成脚本,再发送到应用服务器,再监控服务 ...