路由的简单应用(生成URL)
这篇文章讲的核心问题是利用路由系统生成URL但是我们,但是我们不是仅仅生成URL,我们的超链接的href属性中,我们在跳转的时候,都需要URL,我们要将的就是在这些实际情况中,路由是如何生成需要的URL的。
我们遇到的第一个问题是,我们的路由系统中有这么多的路由规则,我们是借助哪一条规则来生成我们的URL的呢?这个就设计到一个路由规则的匹配的问题了。
生成URL时候路由匹配的原则:
路由要匹配,必须保证URL partern中的每一个Segment都必须被赋值,数据的来源:
1、路由系统首先到我们的 @Html.ActionLink() 方法中的参数去寻找,
2、然后参考用户请求当前页面的segment变量的值
3、最后查看路由的默认值
利用路由系统生成超链接
生成默认controller下的url:
@Html.ActionLink("key的主页", "Index")
生成指定controller下的url:
@Html.ActionLink("This targets another controller", "Index", "Admin") //Admin为Controller的名称
传递额外的值:
渲染前:@Html.ActionLink("This is an outgoing URL","CustomVariable", new { id = "Hello" })
1、如果在路由中id没有作为segment 变量的一部分渲染后:
<a href="/App/DoCustomVariable?id=Hello">This is an outgoing URL</a>
2、如果在路由中id作为segment变量的一部分,渲染后:
<a href="/Home/CustomVariable/Hello">This is an outgoing URL</a>
与当前请求URL相关的匹配:
需要匹配的路由为:routes.MapRoute("MyRoute", "{controller}/{action}/{color}/{page}");
发出请求的页面URL为:/Catalog/List/Purple/123
需要被渲染的方法为:@Html.ActionLink("Click me", "List", "Catalog", new {page=789}, null)
看到的第一感觉是这个方法不能成功的匹配到该路由,但是事实上他是匹配到了,那么他的color 的segment值从哪里来的呢?就是从发出请求的当前URL中参考过来的。这个特性在参数的位置不同的时候会有不同的效果,既不利于阅读,也容易导致混乱,所以我们要避免使用这个特性
生成<a>带有属性值的超链接
@Html.ActionLink("This is an outgoing URL","Index","Home", null, new {id = "myAnchorID",@class = "myCSSClass"})
渲染以后:<a class="myCSSClass" href="/" id="myAnchorID">This is an outgoing URL</a>
创建URL带有完全限定名的超链接
@Html.ActionLink("This is an outgoing URL", "Index", "Home",
"https", "myserver.mydomain.com", " myFragmentName",
new { id = "MyId"},
new { id = "myAnchorID", @class = "myCSSClass"})
渲染之后:
<a class="myCSSClass" href="https://myserver.mydomain.com/Home/Index/MyId#myFragmentName"
id="myAnchorID">This is an outgoing URL</a>
指定特定的路由规则来生成路URL
@Html.RouteLink("Click me", "MyOtherRoute","Index", "Customer")
前面我们生成链接时都是使用的Html.ActionLind() 方法,这个方法是按照先后顺序来匹配路由的
现在我们用的Html.RouteLink() 方法,它的第二个参数就是在指定特定的路由,以此来生成超链接。
利用路由系统生成URL
@Url.Action("action","controller")
渲染以后:/controller/action
在action中应用:
用法1:获取URL
public ViewResult MyActionMethod() {
string myActionUrl = Url.Action("Index", new { id = "MyID" });
string myRouteUrl = Url.RouteUrl(new { controller = "Home", action = "Index" });
//... do something with URLs...
return View();
}
利用路由系统实现Redirect
用法2:跳转到当前Controller的一个Action
public RedirectToRouteResult MyActionMethod() {
return RedirectToAction("Index");
}
用法3:跳转到指定的路径:
public RedirectToRouteResult MyActionMethod() {
return RedirectToRoute(new {
controller = "Home",
action = "Index",
id = "MyID" });
}