ASP.NET MVC输出生成Url链接详解

ASP.NET mvc经常有页面跳转和输出Url链接的时候,下面我们就来说说ASP.NET MVC中怎么输出生成友好的Url链接。据我了解有三种常用的方法。

我的Global.asax是如下注册路由的:

 
  
  1. public static void RegisterRoutes(RouteCollection routes) {
  2. routes.MapRoute("MyRoute", "{controller}/{action}/{id}",
  3. new { controller = "Home", action = "Index", id = UrlParameter.Optional });
  4. }

一、ASP.NET MVC在视图中生成Url链接

1、采用Html Helper方法

最简单的方式就是采用Html.ActionLink方法:

 
  
  1. @Html.ActionLink("About this application", "About")
输出的Html为:
  1. href="/Home/About">About this application
上面我们没有指定Controller,但是链接中还是为我们加上了,因为Html.ActionLink如果没有指定Controller默认就是指当前视图所有的相同的Controller。Html.ActionLink有9个重载方法,第一个是超链接的显示的文字。下面例举Html.ActionLink常用参数的格式及常用方法。


调用方法
输出的Html
@Html.ActionLink("关于我们", "About")
关于我们
@Html.ActionLink("关于我们","About","Home")
关于我们
@Html.ActionLink("关于我们", "About", "Home", new {@class="curr",id="link1",name="link1",target="_blank" })
关于我们
@Html.ActionLink("关于我们", "About",new {controller="Home"})
关于我们
注意:上面为超链接加class的时候之前要加@,是因为class是关键词,不加@会报错。

2、直接写链接

要在MVC视图中生成Url超链接除了调用Html.ActionLink之外,还可以采用最原始的方法直接写。

关于我们

Html.ActionLink和直接写A标签都可以实现,那为什么还要用Html.ActionLink呢?使用Html.ActionLink的好处是当我们路由规则变化的时候不用改视图,Html.ActionLink生成的链接会自动的做相应的调整。如下面我们把之前的路由规则改成一下。

  1. public static void RegisterRoutes(RouteCollection routes) {
  2. routes.MapRoute("NewRoute", "App/Do{action}",
  3. new { controller = "Home" });
  4. routes.MapRoute("MyRoute", "{controller}/{action}/{id}",
  5. new { controller = "Home", action = "Index", id = UrlParameter.Optional });
  6. }
我们在视图有这样的代码:
 
  
  1. @Html.ActionLink("关于我们","About","Home")
不用做任何的调整,最终生成的Url链接是:

关于我们

不只是这样,所有的页面只要采用Html.ActionLink的方式输出Url链接的,且controller为Home的都会加上/App/Do这样前缀。

调用方法
输出的Html
@Html.ActionLink("关于我们", "About")
关于我们
@Html.ActionLink("关于我们","About","Home")
关于我们
@Html.ActionLink("关于我们", "About", "Home", new {@class="curr",id="link1",name="link1",target="_blank" })
关于我们
@Html.ActionLink("关于我们", "About",new {controller="Home"})
关于我们
注意: 可以看到生成的链接是没有带Controller信息。因为我新加的路由规则是这样的:App/Do{action},只有action。由此可以看出Html.ActionLink是根据注册路由规则来为我们生成相关的Url链接的。

3、ASP.NET MVC生成链接指向其它Controller

Html.ActionLink方法如果没有指定Controller参数,默认就是指当前视图所有的相同的Controller。要把生成链接指向其它Controller也很简单,调用Html.ActionLink含有Controller的重载方法就可以了。

 
  
  1. @Html.ActionLink("About this application", "About", "MyController")


生成的Url链接:

  1. href="/MyController/About">About this application
注意:使用Html.ActionLink方法生成Url链接时,MVC路由系统并不会坚持这个Controller和Action是否真实存在,如果你指定一个不存在的Controller和Action,是能够正常的输出链接的,但是当请求会报错。

4、为ASP.NET MVC生成的链接加上其它参数

在ASP.NET MVC中URL请求传递所有的参数(包括controller、action和其它自定的参数)都会在一个RouteData里面。我们在调用Html.ActionLink方法时指定参数routeValues的值就可以了,这个参数是类型为object。我们可以传递一个匿名类对象给它,如下:

  1. @Html.ActionLink("关于我们", "About",new {controller="Home"})


上面我们指定了controller的值,下面我们指定id的值:

 
  
  1. @Html.ActionLink("About this application", "About", new { id = "MyID" })
生成的链接:
  1. href="/Home/About/MyID">About this application
如果我们把路由规则改成如下:
  1. routes.MapRoute("MyRoute", "{controller}/{action}/{color}/{page}");
 
  
  1. @Html.ActionLink("Click me", "List", "Catalog", new {page=789}, null)
上面调用ActionLink会采用新的路由规则生成链接如下:
  1. href="/Catalog/List/Purple/789">Click me
如果我们在ActionLink中传递一个路由规则中没有的参数如下:
  1. @Html.ActionLink("Click me", "List", "Catalog", new {page=789,pwd="2"}, null)
生成的链接会以查询字符串的形式跟在url后面,如下:
  1. href="/Catalog/List/Purple/789?pwd=2">Click me

5、为Html.ActionLink生成链接指定html属性

链接A标签经常会需要加class、id、target等html属性,Html.ActionLink为我们提供了这样的参数。

 
  
  1. @Html.ActionLink("About this application", "Index", "Home", null,
  2. new {id = "myAnchorID", @class = "myCSSClass",target="_blank"})
生成的链接如下:
  1. class="myCSSClass" href="/" id="myAnchorID" target="_blank">About this application

6、生成完整的全路径Url链接

有时候我们需要生成一个完整的Url,包括http,主机头等。如下:

 
  
  1. @Html.ActionLink("About this application", "Index", "Home",
  2. "https", "myserver.mydomain.com", " myFragmentName",
  3. new { id = "MyId"},
  4. new { id = "myAnchorID", @class = "myCSSClass"})
输出链接:
  1. class="myCSSClass" href="https://myserver.mydomain.com/Home/Index/MyId#myFragmentName"
  2. id="myAnchorID">About this application

8、生成文本的Url地址

当我们需要生成一个URl地址,而不是生成一个A链接时,我们可以调用Url.Action来生成生成文本的Url地址。

 
  
  1. My URL is: @Url.Action("Index", "Home", new { id = "MyId" })
输出:
  1. 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,这是一个路由相关信息类。

 
  
  1. @Html.RouteLink("Routed Link", new { controller = "Home", action = "About", id="MyID"})
  2. @Url.RouteUrl(new { controller = "Home", action = "About", id = "MyID" })
上面都是传递的一个匿名类,分别输出结果:
  1. href="/Home/About/MyID">Routed Link
 
  
  1. /Home/About/MyID

二、ASP.NET MVC在Action方法中生成Url链接

除了在View视图中要用到Url链接,在Action中也会用到,比如在Action中会用到Action跳转。


 
  
  1. public ViewResult MyActionMethod() {
  2. string myActionUrl = Url.Action("Index", new { id = "MyID" });
  3. string myRouteUrl = Url.RouteUrl(new { controller = "Home", action = "Index" });
  4. //... do something with URLs...
  5. }
ASP.NET MVC在Action方法重定向和跳转:
 
  
  1. public ActionResult MyActionMethod() {
  2. return RedirectToAction("Index");
  3. }
上面没有指定Controller,默认就是当前的Controller。要跳转到其它的Controller的Action就要调用RedirectionToAction的重载函数或RedirectToRoute。如下:
 
  
  1. public ActionResult MyActionMethod() {
  2. return RedirectToAction("Index","Home");
  3. }
 
  
  1. public ActionResult MyOtherActionMethod() {
  2. return RedirectToRoute(new { controller = "Home", action = "Index", id = "MyID" });
  3. }

三、ASP.NET MVC指定特定路由规则来生成Url链接

定义路由规则的时候我们一般都指定了名字(MapRoute的第一个参数),如下:


 
  
  1. routes.MapRoute("MyRoute", "{controller}/{action}");
  2. routes.MapRoute("MyOtherRoute", "App/{action}", new { controller = "Home" });
ASP.NET MVC中为路由指定名字(MyRoute和MyOtherRoute)有两个作用。

一、起到一个标记路由的用途,可读性

二、可以指定一个特定名称的路由用于生成Url链接

上面我们注册了MyRoute和MyOtherRoute两个路由,这个注册是有先后顺序的,先出现的会被先使用,比如当我们调用下面代码:

 
  
  1. @Html.ActionLink("Click me", "About");
生成的Url链接总是使用MyRoute这个路由,如果你想使用下面一个就要使用Html.RouteLink指定特定的路由规则名称来限定。
 
  
  1. @Html.RouteLink("Click me", "MyOtherRoute", new { action = "About" });

你可能感兴趣的:(ASP.NET,MVC)