欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC Routing、Areas、URLs

程序员文章站 2023-12-05 09:40:34
webform页面运行起来url一般是这样的:localhost:****/index.x,这个过程就是当你运行页面的时候,vs开发工具自带的微型服务器会打开你存在硬盘上的这个文件然后显示在上,所以...
webform页面运行起来url一般是这样的:localhost:****/index.x,这个过程就是当你运行页面的时候,vs开发工具自带的微型服务器会打开你存在硬盘上的这个文件然后显示在上,所以url是后半部分是页面的名字(index.aspx),但是在m中却是这样的:localhost:****/index,因为mvc中有一整套路由机制来控制浏览器的请求。

 

看看global.asax文件里路由的定义:

 

复制代码

public static void registerroutes(routecollection routes)

{

    routes.ignoreroute("{resource}.axd/{*pathinfo}");

 

    routes.maproute(

        "default", // 路由名称

        "{controller}/{action}/{id}", // 带有参数的 url

        new { controller = "home", action = "index", id = urlparameter.optional } // 参数默认值

    );

}

复制代码

注释掉这个默认的路由,自己重新定义一个路由:

 

 

 

根据vs的只能提示可以看出参数一个是路由名称,一个是路由的模式,定义为这样:

 

routes.maproute("myroute", "{controller}/{action}");

有了路由了就可以去创建控制器了,新建一个homecontroller:

 

复制代码

public class homecontroller : controller

{

    public actionresult index()

    {

        return view();

    }

}

复制代码

再去创建一个对应的view:

 

复制代码

@{

    layout = null;

}

<!doctype html>

<html>

<head>

    <title>index</title>

</head>

<body>

    <p>

        homecontroller下的index action响应的同名视图index

    </p>

</body>

</html>

复制代码

直接运行程序发现报404错误,找不到页面。查看下路由就知道了问题:这个路由指定的是url模式是{controller}/{action}的方式,而浏览器里的url却是localhost:****,既没有写controller,也没有写action,显然不符合路由的定义,自然得报404错了。把url补充完整就可以找到页面了:localhost:****/home/index,当然如果在url后面少一级或者多加一级都会报404错:localhost:****/home、localhost:****/home/index/1,可见url必须严格根据路由的定义来。

当然,也可以在路由定义的时候就给默认值:

 

routes.maproute("myroute", "{controller}/{action}", new { controller = "home", action = "index" });

这样运行程序就不报错了:localhost:****,根据路由给的默认值就相当于:localhost:****/home/index

 

再看这两条路由的定义:

 

routes.maproute("", "customers/{controller}/{action}");

routes.maproute("", "x{controller}/{action}"); 

第一条路由对应的url是这样的:localhost:****/customers/home/index 

第二条是:localhost:****/xhome/index

区别:第一条是静态的路由,第一级目录必须是路由里指定了的customers,而第二条路由则是动态可变的,第一级只要以x开头都可以和本路由匹配上

 

路由的顺序:

如果同时定义了这么两条路由:

 

routes.maproute("myroute", "{controller}/{action}");

routes.maproute("", "x{controller}/{action}");

现在浏览器有这么条url请求过来了:localhost:****/xhome/index 看到xhome好像得使第二条路由了,但是不是。这条url同时符合两条路由就优先使用前面的路由。根据第一条路由,这条url过去就是找xhome这个控制器controller里的index action

 

混合的静态路由,带默认值:

 

routes.maproute("shopschema", "shop/{action}", new { controller = "home" }); 

这条名为shopschema的路由没有定义controller,而是给了一个默认值home,但是如果直接请求localhost:****/home/index 虽然有homecontroller,但是还是会报404,因为路由已经限制了controller部分必须是shop,所以url得是这样:localhost:****/shop/index,虽然没有shopcontroller,但是同样会导向到homecontroller下。

注:为了演示路由效果,防止前面定义的路由影响到url请求的控制器,所以得先把之前的所有路由都注释了再运行查看效果。

 

routes.maproute("shopschema2", "shop/oldaction", new { controller = "home", action = "index" });

url:localhost:1042/shop/oldaction 找的同样是homecontroller下的index这个action

 

定义额外的参数:

路由当然不光可以定义controller和action,同时也可以定义之后的参数,比如:

 

routes.maproute("myroute", "{controller}/{action}/{id}", new { controller = "home", action = "index", id = "10086" });

在控制器下可以这么拿到传进来的id参数:viewbag.customvariable = routedata.values["id"];

视图view中这么调用:@viewbag.customvariable

 

{controller}/{action}/{id} 对应的url是这样的:localhost:****/home/index/10010  视图中输出:10010

 

当然,因为路由给了默认值,所有一下url都可以:

localhost:****

localhost:****/home

localhost:****/home/index  输出的都是:10086

 

可选参数:

 

routes.maproute("myroute", "{controller}/{action}/{id}", new { controller = "home", action = "index", id = urlparameter.optional });

optional这个在ef配置实体之间的一对一、一对多等关系里演示过,表示可选的意思,这里的路由也是一样,表示id部分就是可选的:

localhost:**** =>  controller = home  action = index

localhost:****/customer  =>  controller = home  action = index

localhost:****/customer/list  =>  controller = home  action = index

localhost:****/customer/list/all  =>  controller = home  action = index  id = all

 

可变长度的路由:

 

routes.maproute("myroute", "{controller}/{action}/{id}/{*catchall}", new { controller = "home", action = "index", id = urlparameter.optional });

localhost:**** =>  controller = home  action = index

localhost:****/customer  =>  controller = home  action = index

localhost:****/customer/list  =>  controller = home  action = index

localhost:****/customer/list/all  =>  controller = home  action = index  id = all

localhost:****/customer/list/all/delete  =>  controller = home  action = index  id = all  catchall = delete

localhost:****/customer/list/all/delete/perm  =>  controller = home  action = index  id = all  catchall = delete/perm

 

指定命名空间:

 

routes.maproute("myroute", "{controller}/{action}", new { controller = "home", action = "index" });