概述
控制器
先在Controllers目录下添加一个类,名叫:
public class DemoController
{
public string Index()
{
return "你好";
}
}
访问地址:
http://localhost:5006/demo/index
假如不出不测的话,你应该能看到网页上的"你好"两个字。
再新建一个类:
using Microsoft.AspNetCore.Mvc;
public class NoContrl : Controller
{
public IActionResult Index()
{
return Content("Test");
}
}
分离两个不常规的控制器类,让我们初窥asp.net core MVC是如何辨认控制器的。这正是我之前说的,商定优于配置最好的表现。这个哲学最早也是为MVC提出来的,后来被.net framework引申到各个方面。
asp.net core mvc辨认控制器,会在项目中发现 以Controller结尾的公开类或者继承自Controller的公开类,并将这些类标志为控制器。当接到用户或者界面转交的恳求时,程序从恳求途径中解析出控制器称号,然后寻觅 <控制器>Controller 或者 <控制器> : Controller 的类。
在默许状况下,一个访问URL会在程序中解析成如下格式:
http://????/[其他参数]
在上文中,我们晓得了控制器的解析规则,那么如今看一下Action的解析规则:
在DemoController中添加如下办法:
public int TestInt()
{
return 10;
}
public object TestObject()
{
return new
{
Name = "TestObject",
Age = 1
};
}
public string TestPublic()
{
return "胜利访问 TestPublic";
}
protected string TestProtect()
{
return "胜利访问 TestProtect";
}
private string TestPrivate()
{
return "胜利访问 TestPrivate";
}
重新启动,后依次访问如下地址:
http://localhost:5006/Demo/TestInt
http://localhost:5006/Demo/TestObject
http://localhost:5006/Demo/TestPublic
http://localhost:5006/Demo/TestProtect
http://localhost:5006/Demo/TestPrivate
然后能够看到,TestInt、TestObject以及TestPublic均能正常访问,但TestProtect和TestPrivate都提示找不到网页或无法访问。
能够看到,关于程序而言,Action就是控制器类里的公开类办法,与办法的返回值无关。也就是说,程序会找到 XXXController 或者名为XXX但继承了Controller的类作为XXX的控制器,然后继续在这个类里寻觅到Action,假如没有找到就会返回404的恳求。
- 路由
在第一节中,我们引见了一下asp.net core mvc如何寻觅控制器和Action,那这一节将引见程序如何从恳求链接中解析出控制器和Action的称号,也就是路由映射。
路由(Routing)担任匹配传入的HTTP恳求,然后将这些恳求发送给应用的可执行终结点。终结点是应用的可执行恳求处置代码单元,也就是我们控制器里的办法(Action)。
2.1 路由的配置
关于一切的asp.net core模板都包括生成在代码中的路由。通常,我们请求路由在Startup.Configure办法中停止配置。
留意,Startup类里有且只要一个Configure办法,不能呈现其重载版本。
该办法的声明普通状况如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env);
假如想要设置路由,需求先注明项目启用路由:
app.UseRouting();
然后运用如下办法配置路由:
app.UseEndpoints(endpoints =>
{
// 配置路由
});
通常关于mvc项目而言,我们普通运用如下方式配置路由:
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
这行代码的意义是:创立一个名字为 default 的映射控制器的路由,映射规则为 {controller}/{action}/{id?},也就是第一个为控制器,第二个为Action,第三个是ID,其中ID能够不存在,当Action无法从恳求地址中解析出来时默许为Index,控制器默许为Home。
经过这个解析,我们能够得知 我们之前访问的
http://localhost:5000/
是哪个控制器里的什么办法来处置了——HomeController.Index。
那么我们修正一下HomeController.Index来考证一下,我们了解能否有误:
public IActionResult Index()
{
return View();
}
// 修正为
public IActionResult Index()
{
return Content("测试");
}
重新运转程序,访问
http://localhost:5000/
然后看到页面呈现:测试字样,能够看到路由系统自动为我们补全了控制器名和action名。假如办法中呈现参数,则自动依照参数名1=值1&参数名2=值2这种方式查看参数。Id为特殊的,会自动依照目录其映射。所以:
http://localhost:5000/控制器1/办法1/id值
http://localhost:5000/控制器1/办法1?id=id值
是一个恳求链接。
2.2 添加路由配置
那么,我们回过头来看一下声明路由的办法:
public static ControllerActionEndpointConventionBuilder MapControllerRoute(this IEndpointRouteBuilder endpoints, string name, string pattern, object defaults = null, object constraints = null, object dataTokens = null);
默许状况下,我们不会设置 defaults、constraints、dataTokens,这三个参数都有含义,这里不对后两个做引见,简单引见一下第一个:
在路由配置的办法里,添加以下内容:
endpoints.MapControllerRoute(
name : "test",
pattern: "DemoTest/{action=Index}/{id?}",
defaults : new
{
Controller = "Demo",
});
至此,我们没有创立名为DemoTest的控制器,但是我们在访问:
http://localhost:5006/DemoTest
依然能得到响应,而且控制器被解析为Demo。
这就是defaults的意义,路由在解析的时分,系统会把defaults中的值自动填充到路由衔接中没有设置的值里。
当我们设置多个路由的时分,路由系统会优先尝试匹配最容易解析的配置。比方说,当我们访问:
http://localhost:5000/DemoTest/
的时分,路由系统会优先从名为test的配置表中解析,只要当无法从这里找到时才会从其他路由中解析。
- 总结
这一篇我们简单引见了控制器与路由映射,能够访问我们本人添加的路由。在开发中,通常状况下,创立的控制器都是以Controller结尾并继承Controller类。这是由于Controller类有很多有用的属性和办法供我们运用,以Controller结尾是为了统一规则,能够让我们一眼看出哪些是控制器。
最后
以上就是潇洒戒指为你收集整理的诺禾-控制器的全部内容,希望文章能够帮你解决诺禾-控制器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复