ASP.NET mvc经常有页面跳转和输出Url链接的时候,下面我们就来说说ASP.NET MVC中怎么输出生成友好的Url链接。据我了解有三种常用的方法。
我的Global.asax是如下注册路由的:
- public static void RegisterRoutes(RouteCollection routes) {
- routes.MapRoute("MyRoute", "{controller}/{action}/{id}",
- new { controller = "Home", action = "Index", id = UrlParameter.Optional });
- }
一、ASP.NET MVC在视图中生成Url链接
1、采用Html Helper方法
最简单的方式就是采用Html.ActionLink方法:
- @Html.ActionLink("About this application", "About")
<a href="/Home/About">About this application</a>
上面我们没有指定Controller,但是链接中还是为我们加上了,因为Html.ActionLink如果没有指定Controller默认就是指当前视图所有的相同的Controller。Html.ActionLink有9个重载方法,第一个是超链接的显示的文字。下面例举Html.ActionLink常用参数的格式及常用方法。
调用方法
输出的Html
@Html.ActionLink("关于我们", "About")
<a href="/Home/About">关于我们</a>
@Html.ActionLink("关于我们","About","Home")
<a href="/Home/About">关于我们</a>
@Html.ActionLink("关于我们", "About", "Home", new {@class="curr",id="link1",name="link1",target="_blank" })
<a target="_blank" name="link1" id="link1" href="/Home/About?Length=4" class="curr">关于我们</a>
@Html.ActionLink("关于我们", "About",new {controller="Home"})
<a href="/Home/About">关于我们</a>
注意:上面为超链接加class的时候之前要加@,是因为class是关键词,不加@会报错。2、直接写链接
要在MVC视图中生成Url超链接除了调用Html.ActionLink之外,还可以采用最原始的方法直接写。
<a href="/Home/About">关于我们</a>
Html.ActionLink和直接写A标签都可以实现,那为什么还要用Html.ActionLink呢?使用Html.ActionLink的好处是当我们路由规则变化的时候不用改视图,Html.ActionLink生成的链接会自动的做相应的调整。如下面我们把之前的路由规则改成一下。
- public static void RegisterRoutes(RouteCollection routes) {
- routes.MapRoute("NewRoute", "App/Do{action}",
- new { controller = "Home" });
- routes.MapRoute("MyRoute", "{controller}/{action}/{id}",
- new { controller = "Home", action = "Index", id = UrlParameter.Optional });
- }
- @Html.ActionLink("关于我们","About","Home")
<a href="/App/DoAbout">关于我们</a>
不只是这样,所有的页面只要采用Html.ActionLink的方式输出Url链接的,且controller为Home的都会加上/App/Do这样前缀。
调用方法 | 输出的Html |
@Html.ActionLink("关于我们", "About") | <a href="/App/DoAbout">关于我们</a> |
@Html.ActionLink("关于我们","About","Home") | <a href="/App/DoAbout">关于我们</a> |
@Html.ActionLink("关于我们", "About", "Home", new {@class="curr",id="link1",name="link1",target="_blank" }) | <a target="_blank" name="link1" id="link1" href="/App/DoAbout?Length=4" class="curr">关于我们</a> |
@Html.ActionLink("关于我们", "About",new {controller="Home"}) | <a href="/App/DoAbout">关于我们</a> |
3、ASP.NET MVC生成链接指向其它Controller
Html.ActionLink方法如果没有指定Controller参数,默认就是指当前视图所有的相同的Controller。要把生成链接指向其它Controller也很简单,调用Html.ActionLink含有Controller的重载方法就可以了。
- @Html.ActionLink("About this application", "About", "MyController")
生成的Url链接:
<a href="/MyController/About">About this application</a>
注意:使用Html.ActionLink方法生成Url链接时,MVC路由系统并不会坚持这个Controller和Action是否真实存在,如果你指定一个不存在的Controller和Action,是能够正常的输出链接的,但是当请求会报错。4、为ASP.NET MVC生成的链接加上其它参数
在ASP.NET MVC中URL请求传递所有的参数(包括controller、action和其它自定的参数)都会在一个RouteData里面。我们在调用Html.ActionLink方法时指定参数routeValues的值就可以了,这个参数是类型为object。我们可以传递一个匿名类对象给它,如下:
- @Html.ActionLink("关于我们", "About",new {controller="Home"})
上面我们指定了controller的值,下面我们指定id的值:
- @Html.ActionLink("About this application", "About", new { id = "MyID" })
<a href="/Home/About/MyID">About this application</
如果我们把路由规则改成如下:
- routes.MapRoute("MyRoute", "{controller}/{action}/{color}/{page}");
- @Html.ActionLink("Click me", "List", "Catalog", new {page=789}, null)
<a href="/Catalog/List/Purple/789">Click me</a>
如果我们在ActionLink中传递一个路由规则中没有的参数如下:
- @Html.ActionLink("Click me", "List", "Catalog", new {page=789,pwd="2"}, null)
<a href="/Catalog/List/Purple/789?pwd=2">Click me</a>
5、为Html.ActionLink生成链接指定html属性
链接A标签经常会需要加class、id、target等html属性,Html.ActionLink为我们提供了这样的参数。
- @Html.ActionLink("About this application", "Index", "Home", null,
- new {id = "myAnchorID", @class = "myCSSClass",target="_blank"})
<a class="myCSSClass" href="/" id="myAnchorID" target="_blank">About this application</a>
6、生成完整的全路径Url链接
有时候我们需要生成一个完整的Url,包括http,主机头等。如下:
- @Html.ActionLink("About this application", "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">About this application</a>
8、生成文本的Url地址
当我们需要生成一个URl地址,而不是生成一个A链接时,我们可以调用Url.Action来生成生成文本的Url地址。
- My URL is: @Url.Action("Index", "Home", new { id = "MyId" })
My URL is: /Home/Index/MyId
9、使用Routing Data来生成链接和Url
在ASP.NET MVC中除了上面提到到得可以使用Html.ActionLink和Url.Action来输出链接和Url,还可以用Html.RouteLink和Url.RouteUrl来来输出链接和Url。Html.RouteLink和Url.RouteUrl在这里不一样的时传递的是Routing Data,这是一个路由相关信息类。
- @Html.RouteLink("Routed Link", new { controller = "Home", action = "About", id="MyID"})
- @Url.RouteUrl(new { controller = "Home", action = "About", id = "MyID" })
<a href="/Home/About/MyID">Routed Link</a>
- /Home/About/MyID
二、ASP.NET MVC在Action方法中生成Url链接
除了在View视图中要用到Url链接,在Action中也会用到,比如在Action中会用到Action跳转。
- public ViewResult MyActionMethod() {
- string myActionUrl = Url.Action("Index", new { id = "MyID" });
- string myRouteUrl = Url.RouteUrl(new { controller = "Home", action = "Index" });
- //... do something with URLs...
- }
- public ActionResult MyActionMethod() {
- return RedirectToAction("Index");
- }
- public ActionResult MyActionMethod() {
- return RedirectToAction("Index","Home");
- }
- public ActionResult MyOtherActionMethod() {
- return RedirectToRoute(new { controller = "Home", action = "Index", id = "MyID" });
- }
三、ASP.NET MVC指定特定路由规则来生成Url链接
定义路由规则的时候我们一般都指定了名字(MapRoute的第一个参数),如下:
- routes.MapRoute("MyRoute", "{controller}/{action}");
- routes.MapRoute("MyOtherRoute", "App/{action}", new { controller = "Home" });
一、起到一个标记路由的用途,可读性
二、可以指定一个特定名称的路由用于生成Url链接
上面我们注册了MyRoute和MyOtherRoute两个路由,这个注册是有先后顺序的,先出现的会被先使用,比如当我们调用下面代码:
- @Html.ActionLink("Click me", "About");
- @Html.RouteLink("Click me", "MyOtherRoute", new { action = "About" });