ASP.NET MVC之视图生成URL(二)

前言

上一节我们讲述了MVC中从控制器到视图传递数据的四种方式,想必大家早已掌握了,那我们继续往下走。

话题

在MVC的Web应用程序中,我们经常会出现这样的操作,从一个视图跳转到另外一个视图,大部分情况下都是通过链接来实现,当然这是一种非常不错的选择,为什么不说这是最好的选择呢?因为它也有其弊端,我们看看如下:

<a href="/Home/Index">这是一个链接</a>

当我们点击这个链接时,Home则对应的是控制器,Index则对应的是Action方法,并发出此请求进行跳转,貌似没有半点错误,但是,但是,如果我某一天想改变这个URL链接呢?要是我想删除Home控制器决定创建一个新的控制器呢,那又该怎么办呢?那这个写死的链接不就失效了吗,也就是说无法正常进行跳转了!不用着急,在MVC中提供一种更加好的方式来解决这个问题,通过路由来实现并解决这个问题最终动态生成URL。废话少说,我们来看看。

内容

在MVC中跳转视图生成链接的方式我们都知道是用 @Html.ActionLink 来进行,利用它的第四个重载方法,如:

@Html.ActionLink("这是一个跳转到Action链接","Index","Home")

第一个参数为链接文本,第二个为控制器上对应的方法Index,最后一个则是控制器Home,最终渲染成html则是:

<a href="/Home/About">这是一个跳转到Action链接</a>

到了这里你觉得是不是@Html.ActionLink的作用也就是如此了,是不是觉得这个来自HtmlHelper的扩展方法也不过如此呢?我们继续往下看。

@Html.ActionLink探讨(一)

我们创建项目并创建如下一个Test控制器,并在该控制器上定义如下两个方法:

    public class TestController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Controller = "Test";
            ViewBag.Action = "Index";
            return View("DisplayActionView");
        }

        public ActionResult MyBlog(string id = "MyBlogId")
        {
            ViewBag.Controller = "Test";
            ViewBag.Action = "MyBlog";
            ViewBag.CustomVariable = id;
            return View();
        }
    }

看了上述定义的Index方法返回的视图是DisplayActionView视图,那我们是不是应该在该控制器下做出如下定义呢:

        public ActionResult DisplayActionView()
        {
            return View();
        }

然后在该视图中显示一下我们已经跳转到该视图了呢,如下:

     <div>
        <h1>DisplayActionView</h1>
    </div>

结果如下:

一切都是那么的合情合理,结果也正确,不要忘记了,我们这节要说的是@Html.ActionLink,别跑题了,到此为止,我们忘记这一切,继续之前的话题。

我们确实要创建DisplayActionView视图只是我们不创建该Action方法,我们直接在Views文件夹下的Shared文件夹下定义该视图。如下:

<body>
    <h1>Controller Invoked: @ViewBag.Controller</h1>

    <h1>Action Invoked: @ViewBag.Action</h1>

    <h3>
        @Html.ActionLink("this is generate url dynamic", "MyBlog")
    </h3>
</body>

当然在上述Test控制器里还有个MyBlog方法未定义视图,我们定义视图内容如下:

<body>
    <h3>Controller processed the URL: @ViewBag.Controller</h3>
    <h3>Controller action invoked: @ViewBag.Action</h3>
    <h3>The custom variable is: @ViewBag.CustomVariable</h3>
</body>

最后的最后我们进行下路由配置:

               routes.MapRoute("CustomRoute", "{controller}/{action}/{id}",
               new
               {
                   controller = "Test",
                   action = "Index",
                   id = UrlParameter.Optional
               });

下面我们运行下程序看看其结果,通过运行Test下的Index方法然后直接跳转到DisplayActionView,如下:

貌似没有什么可看的,我们知道上述 this is generate url dynamic 链接是由如下而生成的:

 @Html.ActionLink("this is generate url dynamic", "MyBlog")

我们用到HtmlHelper的扩展方法ActionLink,上述我们是重载了第一个方法,第一个参数是链接文本,而第二个则是Action名称,但是我们并未给出其控制器名称即控制器未知。我们把鼠标放在该链接上看看,如下:

到这里想必我们大概能知道 @Html.ActionLink 的作用了,我们回归起初的话题我们利用 <a href="/Home/Index">这是一个链接</a> 将控制器写死,当我们删除该控制器那后果可想而知,当我们通过上述利用@Html.ActionLink来实现时则是通过控制器来动态生成该链接,即使我们删除控制器创建一个新的控制器该链接会动态的重新生成,这才是在MVC中要给出@Html.ActionLink的最后渲染成a标签的真正作用所在。下面我们继续进行该探讨。

@Html.ActionLink探讨(二)

我们再来定义一个Blog控制器,如下:

    public class BlogController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Controller = "Blog";
            ViewBag.Action = "Index";
            return View("DisplayActionView");
        }
        public ActionResult Comments()
        {
            ViewBag.Controller = "Blog";
            ViewBag.Action = "Comments";
            return View("DisplayActionView");
        }
    }

我们在DisplayActionView视图中添加访问Blog控制器的Comments方法,如下:

     <h3>
        @Html.ActionLink("This is a Blog controller", "Comments", "Blog")
    </h3>

我们在路由配置中在上述已经路由中再配置一个,如下:

               routes.MapRoute("BlogRoute", "ASP.NET_MVC_2/Blog{action}",
               new { controller = "Test" });

我们运行程序,得到如下结果:

我们看到上述@Html.ActionLink链接地址,我们点击进去看看:

从这里看到了 @Html.ActionLink 的真正作用,同时我们也知道MVC对于Web Form的一大优势,路由配置的灵活以及虚拟路径的配置。

结语

由上述已验证,我们知道@Html.ActionLink不仅仅是写一个控制器和Action方法然后渲染成a标签进行跳转,它的灵活上述我们已经阐述完毕,希望通过此节的描述让大家能明白@Html.ActionLink真正用处并切实体会到动态生成url的妙处。

时间: 2024-10-12 17:11:44

ASP.NET MVC之视图生成URL(二)的相关文章

ASP.NET MVC之视图生成URL

在MVC的Web应用程序中,我们经常会出现这样的操作,从一个视图跳转到另外一个视图,大部分情况下都是通过链接来实现,当然这是一种非常不错的选择,为什么不说这是最好的选择呢?因为它也有其弊端,我们看看如下: <a href="/Home/Index">这是一个链接</a> 当我们点击这个链接时,Home则对应的是控制器,Index则对应的是Action方法,并发出此请求进行跳转,貌似没有半点错误,但是,但是,如果我某一天想改变这个URL链接呢?要是我想删除Home

Asp.net MVC 用UrlHelper生成url地址的优势

在Asp.net WebForm开发中,我们通过a标签进行跳转时,通常的写法是:<a href="index.aspx">首页</a>, 在Asp.net MVC中我们也可以这样写:<a href="/Home/Index">首页</a>,这就是我要讲的MVC中超链接的第一种方法. Asp.net MVC的请求是通过路由的规则来控制的:系统默认规则如下代码 routes.MapRoute( name: "De

如何在ASP.NET MVC 中获取当前URL、controller、action

一.URL的获取很简单,ASP.NET通用: [1]获取 完整url (协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [2]获取 虚拟目录名+页面名+参数: string url=Request.RawUrl;(或 string url=Request.Url.PathAndQuery;) [3]获取 虚拟目录名+页面名:string url=HttpContext.Current.Request.Url.AbsolutePath

跟我学ASP.NET MVC之十一:URL路由

跟我学ASP.NET MVC之十一:URL路由摘要: 在MVC框架之前,ASP.NET假定在请求的URLs和服务器硬盘文件之间有直接的关系.服务器的职责是接收浏览器请求,从相应的文件发送输出. 这种方法只能工作于Web表单,每一个ASPX页面既是一个文件,也是一个对应请求的自包含响应.而这对于MVC应用程序来说就无效了,因为请求是由控制器类里的行为方法处理的,而且没有磁盘上一对一关系的文件. ASP.NET平台使用路由系统处理MVC URLs.在这篇文章中,我将向你展示怎样为你的工程使用路由系统

ASP.NET MVC 5 - 视图

原文:ASP.NET MVC 5 - 视图 在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所引入的Razor视图引擎(Razor view engine).Razor视图模板文件使用.cshtml文件扩展名,并提供了一个优雅的方式来使用C#语言创建所要输出的HTML.用Razor编写一个视图模板文件时,将所需的字符和键盘敲击数量降到了最低,并实现

ASP.NET MVC的运行机制--url的全局分析

全局 首先我们来看一副图片 首先,用户通过Web浏览器向服务器发送一条url请求,这里请求的url不再是xxx.aspx格式,而是http://HostName/ControllerName/ActionName/Parameters的样子.这个请求被ASP.NET MVC的路由映射系统截获.(路由映射可以在Global.asax中配置,我们一会再说)路由映射系统按照映射规则,解析出控制器名ControllerName,Action名ActionName和各个参数Parameters,然后,找寻

Asp.Net Mvc Razor视图语法

    Asp.Net Mvc Razor视图语法 [email protected]符号输出变量值 2.使用C#语法嵌套Html标签循环输出NameList的值:使用@{C#语法代码}: 3.输出@符号使用两个@@ 4.服务器注释使用@*注释内容*@ [email protected]:输出文本,或者使用<text></text> 6.在@()括号进行简单的操作或运算 [email protected]()或@{}可以输出带有html标签的字符串 8.Razor可以智能识别邮箱写

ASP.NET MVC 部分视图

转自http://blog.csdn.net/skyandcode/article/details/22594355 [部分视图] ASP.NET MVC 里的部分视图,相当于 Web Form 里的 User Control.我们的页面往往会有许多重用的地方,可以进行封装重用.使用 部分视图 :  1. 可以简写代码.2. 页面代码更加清晰.更好维护. [如何使用] 在视图里有多种方法可以 加载部分视图,包括: Partial()  Action()  RenderPartial()  Ren

ASP.NET MVC 学习之路由(URL Routing)

在ASP.NET MVC中,一个URL请求是由对应的一个Controller中的Action来处理的,由URL Routing来告诉MVC如何定位到正确的Controller和Action. 默认路由表 当我们在VS中创建一个新的 ASP.NET MVC程序,程序将会自动使用默认的路由表. public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInf