第 4 章 资源操作 4.5 创建资源 由于创建资源的 Id 会在服务端生成,因此在创建资源时,不建议使用与获取数据时相同的 DTO,而要单独创建一个新的 DTO 类,并通过数据注解特性对相应 的属性做限制...authorDto); // 返回201 Created 状态码,并在响应消息头中包含 Location 项,它的值是新创建资源的 URL // 第一个参数是要调用 Action 的路由名称...value:对象的值 op 的值包括以下6种: add remove replace copy move test 因此以下内容会更新图书资源的 Title 属性,并清空 Description 属性...中,对于不支持的 Accept 类型返回 406 NotAcceptable 这一配置项默认为 false,因此它会返回默认格式,可以在 ConfigureService 方法中添加 MVC 服务时配置...Formatter 是 ASP.NET Core 中用于处理数据输出或输入格式的组件,它分为两类:输出 Formatter 和输入 Formatter 前者满足 HTTP 请求消息头的 Accept 项,后者匹配
路由属性(Route Attribute) 按照英文的直接翻译,Routing Attribute 的意思是路由属性,但实际上 Attribute在微软的官方称呼是特性。...那么,我们了解了RouteAttribute的适用范围,继续看这个类,一共有三个属性: Name 表示这个路由特性的名称 Order 表示启用顺序,值越小,越先被匹配。...所以,这一节我们就介绍一下路由特性(属性路由)如何设置参数的解析吧。...不区分大小写 datetime {dob:datetime} 2016-12-31, 2016-12-31 7:32pm 在固定区域性中匹配有效的 DateTime 值。请参阅前面的警告。...guid {id:guid} CD2C1638-1638-72D5-1638-DEADBEEF1638 匹配有效的 Guid 值 long {ticks:long} 123456789, -123456789
AuthorDto>(author); // 返回201 Created 状态码,并在响应消息头中包含 Location 项,它的值是新创建资源的 URL // 第一个参数是要调用 Action 的路由名称...nameof(GetAuthorsAsync), new { authorId = authorCreated.Id }, authorCreated); } 当数据发生变化时,EF Core 会将实体对象的属性及其状态修改...base.OnActionExecutionAsync(context, next); } } } 如果检查结果不存在,则结束本次请求,并返回 404 Not Found 状态码;反之,则继续完成 MVC...bookDtoList = Mapper.Map>(books); return bookDtoList.ToList(); } 重构 GetBook 方法与此类似...Mapper.Map(book); return bookDto; } 当添加一个子级资源,将 BookForCreationDto 对象映射为 Book 后,还需要为其 AuthorId 属性设置值
路由系统的工作流程如下: 接收传入的 URL 请求。 根据路由模板匹配请求的 URL。 如果找到匹配的路由,则将请求转发给相应的处理程序。 如果没有找到匹配的路由,则返回 404 错误。...需要注意的是,这种对ApiController无效,适合MVC模式。只要有ApiController特性标签,则必须使用[Route]特性标记路由。...属性路由 属性路由是通过在处理程序的属性上添加路由特性来定义的。...guid:表示参数必须是 GUID。 long:表示参数必须是长整数。 下表是官方给出的约束表格: 要在路由模板中使用约束,可以在参数名称后面使用冒号 :,并指定约束的名称。...,包括路由的基本原理、路由模板、路由参数、路由约束和路由属性。
当调用RouteAsync方法时,Route使用路由模板语法定义匹配URL路径的模式,当调用GetVirtualPath方法时,Route会使用相同的路由模板生成URL。 ...MVC路由例子 routes.MapRoute( name: "default_route", template: "{controller}/{action}/{id?}"...POST /hello/Joe 匹配GET请求> GET /hello/Joe/Smith 匹配> 框架提供了一系列的创建路由扩展方法 MapRoute MapGet...MapPost MapPut MapDelete MapVerb 路由约束 约束 示例 匹配示例 注释 int {id:int} 123 匹配所有整型 bool {active:bool...float} 3.14 匹配一个合法的 float 值 guid {id:guid} 7342570B- 匹配一个合法的 Guid 值 long {ticks:long} 123456789 匹配一个合法的
(设置)注入和接口注入,而我个人习惯将其划分为一种(类型)匹配和三种注入: 类型匹配(Type Matching):虽然我们通过接口(或者抽象类)来进行服务调用,但是服务本身还是实现在某个具体的服务类型中...真正的MVC在ASP.NET MVC中的体现如下图所示。 ? 对于一个ASP.NET MVC应用来说,用户交互请求直接发送给Controller。...构造函数中的参数containnerName表示使用的UnityConainer的配置名称,如果静态字典中存在着与之匹配的UnityConainer对象,则直接获取出来作为UnityConainer属性的值...根据我们即将注册的路由规则,这个链接地址的格式为/Employee/Detail/{Name}/{Id}。...在RegisterRoutes方法中我们注册两个路由,前者针对Detail操作(URL模版包含员工的ID和姓名),后者针对Index操作。
我们可以采取日志记录、异常替换和封装这些常用的异常处理方式; 对于处理后的异常,如果异常处理策略规定需要将其抛出,则会自动重定向到与异常类型匹配的出错页面。...我们会维护一个异常类型和Error View的匹配关系; 对于处理后的异常,如果异常处理策略规定不需要将其抛出,则会执行与当前Action操作相匹配的错误处理Action进行处理。... 24: 25: 26: 现在我们通过路由映射将...而属性GetErrorView是一个用于获得作为错误页面的ViewResult对象的委托。...这就是为什么我们会通过ValidationSummary显示错误信息的原因。
表现为请求地址与目标Controller和Action的动态映射的URL路由系统并不是专属于ASP.NET MVC,而是直接建立在ASP.NET 中。...有人可能会问,为什么我们要在URL同时包含员工的姓名和ID呢?...对于指定了默认值的路由对象,在当前请求地址的后续部分缺失的情况下,它会采用提供的默认值对该地址进行填充之后再进行模式的匹配。...Page具有一个类型为System.Web.Routing.RouteData的RouteData表示通过注册的与当前请求匹配的路由对象对请求地址进行解析生成的路由数据。...RouteData的Values属性是一个存储路由变量的字典,其Key为变量名称。
当Web API接收到一个请求的时候,它将这个请求路由到一个Action。 注意:Web API的路由与Asp.Net MVC的路由是非常相似的。...category=category 然而,以下URI就不匹配,因为它缺少“api”字段 /product/1 注意:在路由中使用“api”的原因是为了避免与ASP.NET MVC...因为如果不注释 Web API会匹配到请求匹配的多个操作错误 ?...这种风格的路由类似于Asp.Net MVC,而且可能与RPC式的API接近。 你也可以通过使用ActionName注解属性来覆盖动作名。...在这种背景下,Action选择算法如下 创建该控制器中与HTTP请求方法匹配的所有Action的列表 如果路由字典有Action条目,移除与该条目值不匹配的Action 试图将Action参数与该URI
[本文已经同步到《How ASP.NET MVC Works?》...如下面的代码片断所示,基于当前Controller上下文构建的RouteDataValueProvider直接将表示当前路由数据的RouteData对象的Values属性(这是一个RouteValueDictionary...当该类型第一次被加载时,该字段被初始化成一个GUID。...表示的GUID。...除此之外,还具有一个DictionaryValueProvider对象,对应的Key是一个GUID,这正是我们上面介绍的针对在HtmlHelper扩展方法Action中指定的路由数据创建的
先贴一下MSDN的HtmlHelper的链接,MSDN对每一个构造函数、属性、方法和扩展方法都做了说明,我这里就常用的部分方法做一下简要的展示。...链接 @Html.ActionLink() 生成超链接,并自动根据路由进行匹配。 Eg: @Html.ActionLink("超链接eg", "About","Hello") ?...自动匹配了超链接的标题,若不指定,则按照当前默认路由规则生成链接,避免了当路由规则发生变化后,需要对超链接进行重复修改。 常量或静态内容 @Html.Raw() 输出打印常量或者静态内容。 ?...namespace System.Web.Mvc 注意:为什么要改命名空间为System.Web.Mvc?...这是因为如果不改命名空间,我们要使用自定义的扩展方法需要在每个页面中引入Models(MyHtmlHelper所在的那个命名空间)这个命名空间,为了防止重复的命名空间引入操作(想想我们使用Html.TextBox()不也没有引入命名空间么
Blazor 的路由系统就和 ASP.NET MVC的路由系统一样,可以为我们提供灵活的选项,可用于确保用户请求到达可处理它们并返回用户想要的信息的组件。...在 组件中,还可使用 标记指定在不存在匹配路由时返回给用户的内容。上面的示例返回单个 段落和错误消息提示"Sorry, there's nothing at this address."...例如,使用此属性指定页面处理对 /Todo 路由的请求: @page "/Todo" 如果要指定到组件的多个路由,请使用两个或更多 @page 指令: @page "/Todo" @page "/TodoItems...URL 匹配时将切换 active CSS 类。...比如将其限制为一个int类型: @page "/myorders/{orderId:int}" 除了int之外,还阔以添加的约束有 bool, datetime, decimal, double, float, guid
Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射 ,也就是浏览器连接程序的作⽤ import org.springframework.stereotype.Controller...⽤到的注解之⼀,它是⽤来注册接⼝的 路由映射的....⽤包装类型 (2)传参顺序不影响结果 当有多个参数时,前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,因此参数的位置是不影响后端获取参数的结果 5:传递对象 package com.example.springbootmvc...Spring 会根据参数名称⾃动绑定到对象的各个属性上, 如果某个属性未传递, 则赋值为null(基本类型则赋值为默认初识值, ⽐如int类型的属性, 会被赋值为0) 6:Requestparam (...public Object r7(Person p){ return p.toString(); } 可以看到我们用postman发送json请求,服务器并没有收到我们想要的值为什么呢
{ controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } 注意:路由中的控制器和操作不区分大小写...当配置多个路由时,从上到下依次匹配,直至匹配到一个。...匹配现有文件 通过设置RouteCollection.RouteExistingFiles属性来确定是否可以匹配到现有文件。...将属性RouteAttribute 标记到控制器或控制器操作上。...在网站上可以看到不只应用于MVC;这里主要是使用这个工具观察路由,所以下载MVC包。
通过在控制器类或操作方法上应用特定的属性,可以定义URL模板,从而实现路由匹配。 重要性: 可读性更强:使用属性路由,可以定义更加清晰和易读的路由路径,使得URL更加友好和易于理解。...**灵活性更高:**属性路由可以更加灵活地定义路由规则,支持多种路由匹配方式,如默认路由、自定义路由、参数路由等。 **可维护性更高:**属性路由的路由规则定义更加集中和清晰,易于维护和管理。...**性能更优:**属性路由在路由匹配时,可以利用编译时静态分析,提前解析路由模板,从而提高路由匹配的性能。...缺点: 相对复杂:属性路由的路由规则定义相对复杂,需要一定的学习成本。 性能较低:属性路由的路由规则定义是在运行时动态定义的,因此在路由匹配时性能相对较低。...比如,[HttpGet("{id:guid}")] 可以约束 id 必须是 GUID 类型。 自定义约束:你可以定义自己的约束。
最后再给大家简单介绍一下在控制台以及Mvc下如何使用DI,以及如何把默认的Service Container 替换成Autofac。...为什么要用它? 初学者特别容易对控制反转IOC(Iversion of Control),DI等概念搞晕。 1.1依赖 当一个类需要另一个类协作来完成工作的时候就产生了依赖。...Singleton, Scoped, Transient } 为了大家能够更好的理解这个生命周期的概念我们做一个测试: 定义一个最基本的IOperation里面有一个 OperationId的属性...这一步是在Mvc初始化控制器的时候完成的,我们后面再介绍到Mvc的时候会往细里讲。 3.3 View中使用 在View中需要用@inject 再声明一下,起一个别名。...loginService.GetUserName() 3.4 通过 HttpContext来获取实例 HttpContext下有一个RequestedService同样可以用来获取实例对象,不过这种方法一般不推荐
为什么要用它? 初学者特别容易对控制反转IOC(Iversion of Control),DI等概念搞晕。 1.1依赖 当一个类需要另一个类协作来完成工作的时候就产生了依赖。...1.3 为什么要反转? 为了在业务变化的时候尽少改动代码可能造成的问题。 比如我们现在要把从EF中去验证登录改为从Redis去读,于是我们加了一个 RedisLoginService。...Singleton, Scoped, Transient } 为了大家能够更好的理解这个生命周期的概念我们做一个测试: 定义一个最基本的IOperation里面有一个 OperationId的属性...这一步是在Mvc初始化控制器的时候完成的,我们后面再介绍到Mvc的时候会往细里讲。 3.3 View中使用 在View中需要用@inject 再声明一下,起一个别名。...loginService.GetUserName() 3.4 通过 HttpContext来获取实例 HttpContext下有一个RequestedService同样可以用来获取实例对象,不过这种方法一般不推荐
,返回的不为空,说明匹配正确,关于路由规则的匹配,说起来也不短,这里就不大幅介绍,有时间下次再开篇详解路由机制。...匹配成功后,返回一个RouteData类型的对象,RouteData对象都有些什么属性呢?...在看看上面的UrlRoutingModule类,里面有一个RoutCollection属性,所以UrlRoutingModule能够获取路由表中的所有规则,这里值得注意的是,路由规则的匹配是有顺序的,如果有多个规则都能够匹配...相反的如果一个请求,没有匹配到任何路由,那么该请求就不会被处理。 这里返回的RouteData里的RouteHandler就是MVCRouteHandler。为什么呢?...生成MvcHander 在上面路由匹配的过程中,与匹配路由相关联的MvcRouteHandler ,MvcRouteHandler 实现了IRouteHandler 接口。
,返回的不为空,说明匹配正确,关于路由规则的匹配,说起来也不短,这里就不大幅介绍,有时间下次再开篇详解路由机制。...匹配成功后,返回一个RouteData类型的对象,RouteData对象都有些什么属性呢?...在看看上面的UrlRoutingModule类,里面有一个RoutCollection属性,所以UrlRoutingModule能够获取路由表中的所有规则,这里值得注意的是,路由规则的匹配是有顺序的,如果有多个规则都能够匹配...相反的如果一个请求,没有匹配到任何路由,那么该请求就不会被处理。 这里返回的RouteData里的RouteHandler就是MVCRouteHandler。为什么呢?...RouteHandler 生成MvcHander 在上面路由匹配的过程中,与匹配路由相关联的
领取专属 10元无门槛券
手把手带您无忧上云