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 控制器作为该连接的目标。

生成输出 URL(16.2)的更多相关文章

  1. 生成输出url时,使用CSS来控制超链接的格式

    在前文<生成输出url>中的第5点,介绍了使用ActionLink生成输出url中指定html标签属性. 例如, 假设Global.asax中的路由定义为: public static v ...

  2. 生成输出url

    继续使用前面的例子11-3URLTestDemo,修改Global.asax中的RegisterRoutes方法如下: public static void RegisterRoutes(RouteC ...

  3. mvc 生成输出url

    最近一直在学习mvc,其中对于 Url.Action生成的url感到很困惑.官方的解释的基于路由方案生成的url.问题是,怎样基于,怎样选择,没有过多的解释.网上找了很多资料,也看不懂,最后还是在pr ...

  4. 生成链接中的全限定URL(Generating Fully Qualified URLs in Links) | 在视图中生成输出URL | 高级路由特性

    结果:<a class="myCSSClass"href="https://myserver.mydomain.com/Home/Index/MyId#myFrag ...

  5. 指定HTML标签属性 |Specifying HTML Attributes| 在视图中生成输出URL |高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼

    结果呢: <a class="myCSSClass" href="/" id="myAnchorID">This is an o ...

  6. 传递额外的值 Passing Extra Values |在视图中生成输出URL | 高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼

    结果呢 <a href="/App/DoCustomVariable?id=Hello">This is an outgoing URL</a> 理解片段变 ...

  7. 用路由系统生成输出URL 在视图中生成输出URL 高级路由特性 精通ASP-NET-MVC-5-弗瑞曼

    Using the Routing System to Generate an Outgoing URL 结果呢:<a href="/Home/CustomVariable" ...

  8. 根据指定路由生成URL |Generating a URL from a Specific Route | 在视图中生成输出URL|高级路由特性

    后面Length=5 是怎么出现的?

  9. 在动作方法中生成输出URL (Generating Outgoing URLs in Action Methods) |

随机推荐

  1. tf.truncated_normal的用法

    tf.truncated_normal(shape, mean, stddev) :shape表示生成张量的维度,mean是均值,stddev是标准差.这个函数产生正太分布,均值和标准差自己设定.这是 ...

  2. python字符串格式化之format

    用法: 它通过{}和:来代替传统%方式 1.使用位置参数 要点:从以下例子可以看出位置参数不受顺序约束,且可以为{},只要format里有相对应的参数值即可,参数索引从0开,传入位置参数列表可用*列表 ...

  3. ubuntu16.04下内核模块解析

    一.环境如下: 1.1内核版本: jello@jello:~$ uname -a Linux jello 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19: ...

  4. 史丰收速算|2014年蓝桥杯B组题解析第四题-fishers

    史丰收速算 史丰收速算法的革命性贡献是:从高位算起,预测进位.不需要九九表,彻底颠覆了传统手算! 速算的核心基础是:1位数乘以多位数的乘法. 其中,乘以7是最复杂的,就以它为例. 因为,1/7 是个循 ...

  5. POJ 2373 Dividing the Path (单调队列优化DP)题解

    思路: 设dp[i]为覆盖i所用的最小数量,那么dp[i] = min(dp[k] + 1),其中i - 2b <= k <= i -2a,所以可以手动开一个单调递增的队列,队首元素就是k ...

  6. 如何在windows中部署Gitblit

    1.安装Java环境 2.下载Gitblit压缩包 http://gitblit.com/ 3.解压后进行配置 编辑gitblit-1.8.0\data\gitblit.properties文件 gi ...

  7. BZOJ2982: combination Lucas

    Description LMZ有n个不同的基友,他每天晚上要选m个进行[河蟹],而且要求每天晚上的选择都不一样.那么LMZ能够持续多少个这样的夜晚呢?当然,LMZ的一年有10007天,所以他想知道答案 ...

  8. 到底二级域名和一级域名哪个更利于SEO

    到底二级域名和一级域名哪个更利于SEO呢?本文是从百度官方转载详细的介绍:二级域名和一级域名的区别,请各位认真阅读. 二级域名和子域名的区别可以通过以下3点来解读: 一,二级域名的特点 搜索引擎往往将 ...

  9. Springboot统一参数验证方式

    Springboot统一验证方式 在提供http api 接口形式的服务中,通过都会传递参数为一个对象.我们需要对这个对象的各个字段进行校验.来判断是否为合法值. 传统的方式为自己获取每个字段的值,自 ...

  10. 02_Spark Application不同模式下的监控

    监控Spark Application的运行 官方文档: http://spark.apache.org/docs/latest/monitoring.html 1.1 监控方式 Driver Pro ...