• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
成为自己最想成为的那种人
博客园    首页    新随笔    联系   管理    订阅  订阅
生成输出 URL(16.2)

1、在视图中生成输出 URL

    几乎在每一个 MVC 框架应用程序中,你都会希望让用户能够从一个视图导航到另一个视图 —— 通常的做法是在第一个视图中生成一个指向第二个视图的链接,该链接以第二个视图的动作方法为目标。

    手工定义 URL 快而简单,但也有很大风险——在每一次修改应用程序的 URL 方案时,都可能打断所有这种编码的 URL。—— 一个更好的替代方法是使用路由系统来生成输出 URL,这能够确保 URL 方案动态地生成 URL,这种方式确保了应用程序的 URL 方案能够得到反映。

  16.2.1 用路由系统生成输出 URL

    在一个视图中生成输出 URL 最简单的办法是,在视图中调用 Html.ActionLink 辅助器方法。(  @Html.ActionLink("链接文本", "目标动作方法的名称")  )

    传给 ActionLink 方法的参数是“链接文本”和“该连接的目标动作方法的名称”。(还有其他重载方式)

    (ActionLink 方法生成的 HTML 是基于当前路由配置的,这种方法能够自动对路由配置的更改进行响应)

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

  16.2.2 以其他控制器为目标

    ActionLink 方法的默认版本假设,输出 URL 的目标动作方法与链接所在视图对应的动作方法属于同一个控制器。

    为了创建一个以不同控制器为目标的输出 URL,可以使用一个重载版本,它允许你指定控制器名称。

     @Html.ActionLink("链接文本", "动作方法", "控制器")  

    (在生成输出 URL 时,路由系统不会对动作方法和控制器的值进行检验,因此你必须小心,不要指定不存在的目标)

    路由系统相当聪明,它知道应用程序中定义的路由会使用默认的 Index 动作方法,所以在渲染视图时,生成的 HTML 中允许省略不必要的片段。(如 Index 动作方法)

    在决定如何以给定给定动作方法为目标时,路由系统包含使用 Route 属性已经定义的路由。即:

      如果控制器中 Index 动作方法如下所示:

          [ Route("~/Test") ]

          public ActionResult Index() {……}

      则 @Html.ActionLink ("XXX", "Index", "Customer") 生成的连接如下:

          <a href="/Text">XXX</ a>

  16.2.3 传递额外的值

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

    注意,如果路由中没有对应的片段变量,则所提供的值会被添加为查询字符串的一部分,融入到路由所描述的 URL 模式中。

      @Html.ActionLink ("XXX", "CustomVariable", new { id = "Hello" })

    在这个例子中,渲染视图时得到以下 HTML:

      <a href="……CustomVariable?id=Hello" >XXX</ a>

    如果修改路由:

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

    则产生如下 HTML:

      <a href="/Home/CustomVariable/Hello">XXX</ a>

    这次,赋值给 id 属性的值被作为 URL 片段包括起来了。

  16.2.4 指定 HTML 标签属性

    ActionLink 辅助器方法生成的是一个完整的 HTML 锚点<a>元素。—— 通过提供一个匿名类型,笔者可以为元素设置标签属性,该匿名类型的属性与所需要的标签属性相对应。

      @Html.ActionLink ("XXX", "Index", "Home", null, new { id = "myAnchorID", @class = "myCSSClass"})

    这里创建了一个新的匿名类型,它具有 id 和 class 属性,并把它作为参数传递给 ActionLink 方法。(这里给其余片段变量值传递了 null,表示未提供任何值)

    (因为 “class” 是 C# 关键字,所以这里要带 “@”)

  16.2.5 生成连接中的全限定 URL

    到目前为止,生成的连接都含有相对 URL,但也可以使用 ActionLink 辅助器方法类生成全限定URL。(这是带有最多参数的 ActionLink 重载版本,它允许提供协议值(如“https”)、目标服务器名、URL片段,以及之前看到的所有其他选项)

    笔者建议尽可能使用相对 URL。(全限定 URL 会对应用程序的基础架构方式参数依赖性)

2、生成 URL(而不是链接)

    Html.ActionLink 辅助器方法生成完整的 HTML 的 <a>元素,这通常是创建视图需要做的事情。

    然而,有些时候只需要一个 URL。—— 在这种情况下,可以用 Url.Action 方法只生成 URL 而不生成 HTML 元素。

    在视图中: @Url.Action("Index", "Home", new { id = MyId})

  16.2.7 在动作方法中生成输出 URL

    大多数情况下会在视图中生成输出 URL,但有时也会在一个动作方法中生成输出 URL。

      string myActionUrl = Url.Action("Index", new { id = "MyID"});  //这里很好地说明了“只生成 URL”,即返回的是 URL 的字符串

    一个更普遍的需求是,将客户端浏览器重定向到另一个 URL。—— 这可以借助于返回 RedirectToAction 方法的调用结果来完成。

        public RedirectToRouteResult MyActionMethod()

        {

          return RedirectToAction("Index");

        }

    RedirectToAction 方法的结果是一个 RedirectToRouteResult 对象,它指示 MVC 框架把一条重定向指令发布给一个 URL,由这个 URL 调用指定的动作。

    (RedirectToAction 方法有一些常用的重载版本,它们可以给生成的 URL 中的片段变量指定控制器和值)

    如果想用一个 URL 发送一个重定向,而这个 URL 只是根据对象的属性生成的,也可以使用 RedirectToRoute 方法,该方法也返回一个 RedirectToRouteResult 对象,并与调用 RedirectToAction 方法具有相同的效果。

        return RedirectToRoute (new { controller = "Home", action = "Index", id = "MyID" });

  16.2.8 根据指定路由生成 URL

    在上述示例中,笔者采用的是让路由系统去选择用来生成 URL 或链接的路由。本小节演示选择指定的路由。

      在 RouteConfig.cs 文件中:

        routes.MapRoute("MyRoute", "{controller}/{action}");

        routes.MapRoute("MyOtherRoute", "App/{action}", new { controller = "Home" });

      对路由命名有两个原因:

        ① 作为路由目的的一种说明。

        ② 便于选择特定的路由,用以生成输出 URL。

      这里已经安排了路由的顺序,使最不具体的路由(变量较多的?)首先出现在路由列表中。

    可以使用 Html.RouteLink 方法来指定一条路由,如下所示:

        @Html.RouteLink("点击", "MyOtherRoute", "Index", "Customer")

    在本例中,路由重载了笔者所指定的控制器 Customer,代之以 Home 控制器作为该连接的目标。

posted on 2017-10-10 18:02  遇见未来  阅读(329)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3