关于MVC重写URL的初级问题。请赐教,感谢
刚自学MVC,想重写下URL.网上都点教程都没看明白,没写的太入门。现在手里也没书,只能问大家了
分不多了,20全给你。感谢
很简单
http://localhost:3853/home/index
这个地址我想写成http://localhost:3853/qqq.htm
再下一步最好能写成http://localhost:3853/qqq_a1b2c3.htm
其实a b c 是我action方法要接收的参数,如果写成这样 是不是还要把action接一个字符串参数,我自己去拆分啊?
---------------------------------------------
还一个额外的问题
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
);
默认的路由配置,我认为所有符合url条件的都应该去Index,问什么他们还能找到自己的同名的view
感谢 感谢
MVC URL
[解决办法]
MVC的那个url是配置的
配置Routing的规则 是在Global.asax里设置的
如果我们把MVC必当成一个乐队的话 那么Route就是这个乐队的指挥可见Route在MVC中的重要性 以下是对Route的一些理解
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
//这个Routes是在什么时候确定的呢 他是在Application_Start的时候确定的
AppLication_Start这个方法是在应用程序开始的时候执行的
}
Routing与URL Rewrite的区别
URL Reewrite 改变程序处理的URL
URL Route 根据URL的规则选择执行
两者执行机制不同
在某些情况下可以产生同样的结果
URL Route更像是一中基础支持
——适合在于开发基于ASP.NET构架的新构架
URL的匹配规则 以下的url都是绝对路径
定义:site/{controller}/{action}/{id}
这个匹配的url必须是四段 第一个必须是site 后面一个必须是数字(id) 中间二个可以随便输入 如 site/a/b/1
可以匹配:site/Products/display/123
不能匹配:/products/display/123 因为这个前面的url没有加site
定义:{language-{contry}/{controller}/{action}
可以匹配:/chinese-china/products/dispay
定义:{controller}.{action}.{id}
可以匹配:/products.display.123
{controller}{action}/{id}无法匹配 这种匹配的方式根本无法匹配 ,因为缺少分割符,这样路由无法匹配运行
默认路由:
添加匹配路由参数
Route.MapRoute("simple",{controller}/{action}/{id},new {id=""});
Route.MapRoute("simple","{controller}/{action}/{id}",new{id="",action="index"})
指定id为空 Controller为Index页面
关于URL的约束
输入的URl是(http://localhost/2012/7/19) (http://localhost/producst/list/food)可以用正则表达式进行约束
routes.MaoRoute("bolg","{year}/{month}/{day}",
new {controller="blog",action="index"}
new {year=@"\d{4}",month=@"\d{2}",day=@"{\d{2}}"}
);
routes.MapRoute("simple","{controller}/{action}/{id}")
有人说你这二条路由顺序有没有讲究,就是说谁在上,谁在下,问这问题的很非常聪明,肯定是动脑子想过这件事,答案是有讲究的,假如我把simple这条写在上面,那么很不幸,上面的那个永远也匹配不上,为什么呢,因为路由的顺序是按照他添加的顺序来匹配的,当遇到路由相同的时候,先注册的路由会先匹配到,先匹配到的时候,我就会用正则表达式来效验他头四位是不是数字,中间二位是不是数字,最后二位是不是数字,如果是那么这条路由就会匹配上,如果不是下一条路由才会调用。所以说正则表达式对于Routes的操作是非常有用的。
注册Area Route
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 URL
new { controller = "Home", action = "index", id = "" } // 参数默认值
);//这是一个匿名对象
}
//这个注册的是一个Default的路由,他接受的参数是{controller}/{action}/{id}
.axd凡是对.asd的请求一概不使用路由而是把它从新导向,解析它
Area Route冲突
如何处理冲突
1.把他们其不同的名字
2.使用一个namespances
扑获所有参数
让route匹配任意多参数
routes.MapRoute("catchllroute","query/{query-name}/{*extrastuff}",
new QueryRouteHandler));
);
匹配的url*extrastuff
/query/select/a/b/ca/b/c
/query/select/a/b/c/a/b/c
/query/select""(route任然可以匹配)
//*extrastuff就是一个大的字符串 如 /query/a/b/c/d/... 可以匹配任意唱的字符
在去网上下个RouteDebug.dll