mvc(5)——URL路由_5_高级特性

版权声明:本文为博主原创文章,未经博主允许不得转载。本人观点或有不当之处,请在评论中及时指正,我会在第一时间内修改。 https://blog.csdn.net/aiming66/article/details/81626232

在前面几篇博客中,讲解了如何使用路由系统处理输入URL,我们还需要能够使用URL方案来生成可以嵌入到视图中的输出URL,以便用户可以单击链接,并以正确的控制器和动作方法为目标,将表单回递给应用程序。下面就来说一下生成输出URL的不同技术,展示如何通过替换标准的MVC路由实现类来定制路由系统,以及使用MVC。

准备项目

我们使用的项目和前几节介绍的url路由使用的项目的相同,但做了部分修改。
1、删除AdditionalControllers文件夹及其所包含的HomeController.cs文件。
2、简化路由

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Routing.Constraints;
using System.Web.Routing;

namespace urlAndRoutes
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            //初始路由
            routes.MapMvcAttributeRoutes();
            routes.MapRoute( "Myroute","{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }               
            );
        }
    }
}

3、最后将描述区域特性,这需要在项目中安装一个新的软件包。在NuGet控制台中输入以下命令:

Install-package Microsoft.AspNet.Web.Optimization -projectname urlandroutes

源码下载地址:
https://download.csdn.net/download/aiming66/10601643
下面进入正题:

1、在视图中生成输出URL、

  几乎在每一个MVC框架应用程序中,都会希望让用户能够从一个视图导航到另一个视图,通常的做法是在第一个视图中生成一个指向第二个视图的链接,该链接以第二个视图的动作方法为目标。
  以下只是一个静态的a元素,其href标签属性以该动作方法为目标,像这样:

<a href="/Home/CustomVariable">This is an outgoing URL</a>

  使用标准的路由配置,此HTML元素创建了一个链接,该链接以Home控制器中CustomVariabIe动作方法为目标。像这样手工定义URL快而简单,但也有很大风险。在每一次修改应用程序的URL方案时,都可能打断所有这种硬编码的URL。然后,你必须拉网式地检查应用程序的所有视图,并更新所有对控制器和动作方法的引用一一这是一个乏味、易错且难以测试的过程。一个更好的替代方法是,使用路由系统来生成输出URL,这能够确保用URL方案动态地生成URL,这种方式保证
了应用程序的URL方案能够得到反映。

a.用路由系统生成url(本身控制器为目标)

在一个视图中生成输出URL最简单的办法是,在视图中调用Html.ActionLink辅助器方法,如下所示

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Custom Varialbe</title>
</head>
<body>
  <div>The Controller is :@ViewBag.Controller</div>
  <div>The action is :@ViewBag.Action</div>
  <div>
    @Html.ActionLink("This is an outgoing url", "Customvariable")
  </div>
</body>
</html>

传给ActionLink方法的参数是,链接文本和该链接的目标动作方法名称。启动应用程序,并让浏览器导航到根URL,便可看到如下结果:
这里写图片描述
点击链接后:
这里写图片描述

ActionLink方法生成的HTML是基于当前路由配置的,将会得到这样的HTML:

<a href="/Home/CustomVariab1e">This is an outgoing URL</a>

现在,这似乎多费了一些手续,才重新创建了前面所示的手工定义的URL,但这种办法的好处是,它能够自动对路由配置的更改进行响应。作为演示,我们向RouteConfig.cs文件添加了一条新路由,修改了路由定义。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Routing.Constraints;
using System.Web.Routing;

namespace urlAndRoutes
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            //用路由系统生成url 新增测试路由
            routes.MapRoute("new Route","Do/app/{action}",new { Controller="Home"});
            //初始路由
            routes.MapMvcAttributeRoutes();
            routes.MapRoute( "Myroute","{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }               
            );
        }
    }
}

启动项目,并导航到:http://localhost:11853/do/app/index
这里写图片描述
点击链接:
这里写图片描述
这是因为此新路由修改了请求Home控制器的URL方案。启动应用程序后,便可以看到此项修改己经在ActionLink辅助器方法所生成的HTML中得到了反映,

<a href="/App/DoCustomVariab1e">This is an outgoing URL</a>

可以看出,以这种方式生成链接可以解决维护问题。我们可以修改路由方案,而在视图中的输出链接会自动地反映出这种修改。而且,当单击链接时,输出URL就自然地成为一个规则请求。

b.以其他路由器为目标

ActionLink方法的默认版本假设,输出URL的目标是引发渲染该视图的同一个控制器中的动作方法。为了创建一个以不同控制器为目标的输出URL,可以使用一个重载版本,它允许你指定控制器名称。


@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>ActionName</title>
</head>
<body>
    <div>The Controller is :@ViewBag.Controller</div>
    <div>The action is :@ViewBag.Action</div>
  <div>
    @Html.ActionLink("This is an outgoing url:", "Customvariable")
  </div>
  <div>
    @Html.ActionLink("This targes another controller ","Index","Admin")@*admin 是控制器名称,或者说是包含路由参数的对象*@
  </div>
</body>
</html>

这里写图片描述
点击链接“This targes another controller”的效果:
这里写图片描述

c.传递额外的值

可以用一个匿名类型为一些片段变量传递值,在这个匿名类型中以其属性表示片段。


@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>ActionName</title>
</head>
<body>
    <div>The Controller is :@ViewBag.Controller</div>
    <div>The action is :@ViewBag.Action</div>

  @<div>
      @Html.ActionLink("This is an outgoing url:", "Customvariable",new { id="Hello"})
    </div>*
</body>
</html>

上述代码中,为id片段变量提供了一个值。如果应用程序使用的路由为:

   routes.MapMvcAttributeRoutes();
   routes.MapRoute( "Myroute","{controller}/{action}", new { controller = "Home", action = "Index" }               
            );

那么在渲染该视图时,便会得到以下HTML:

<a href="/App/DoCustomVariab1e?id=Hello">This an outgoing URL</a>

注意,所提供的值己经被添加为查询字符串的一部分,触入到路由所描述的URL模式中。这是因为在该路由中没有与id相对应的片段变量。为此我们需要修改RouteConfig.cs文件的路由,以使得只有一个路由恰好使用了id片段。

 routes.MapMvcAttributeRoutes();
routes.MapRoute( "Myroute","{controller}/{action}/{id}",new { controller = "Home", action = "Index", id = UrlParameter.Optional }               
            );

如果再次启动应用程序,调用ActionName.cshtml视图中的ActionLink辅助器方法,会产生如下的HTML元素:

< a href="/Home/customVariab1e/Hello"> This is an outgoing URL </a>

这次,赋值给id属性的值被作为URL片段包括进来了,与应用程序配置中的活动路由保持一致。
源码地址:
https://download.csdn.net/download/aiming66/10601652

猜你喜欢

转载自blog.csdn.net/aiming66/article/details/81626232