【问题标题】:MVC: capture route url's and pass them to javascript functionMVC:捕获路由 url 并将它们传递给 javascript 函数
【发布时间】:2010-02-02 12:32:34
【问题描述】:

简短:
有没有办法让路由定义将“CONTROLLER/ACTION”字符串值传递给 JavaScript 函数,而不是直接执行控制器操作?

更多:
我有一个包含网站导航的母版页。现在,所有页面都需要始终围绕它进行导航,但是因为我不希望导航在每次页面调用时不断加载,所以我将所有页面都更改为部分视图。 每当在导航中单击菜单项时,这些部分视图都会通过 JQuery.Load() 方法加载。

到目前为止,这一切都很好,因为我注意到网站也需要能够直接链接到页面 X,而不是 default.aspx。

举个例子:
主页面是我的“default.aspx”页面,它利用了我的母版页和它周围的导航。每次对新页面的调用都使用一个 javascript 函数,该函数将特定的部分视图加载到我的母版页中已知的 div 中。所以,url 永远不会从“default.aspx”改变,但我的内容会发生变化。

问题是,当直接在地址栏中输入时,这些 url 也需要可用。但是,它们是部分视图,因此直接从地址栏加载它们会使它们显示时周围没有任何母版页。因此,我的问题是是否有可能捕获输入到地址栏中的路由并将其传递给我的 JavaScript 函数,该函数将在内容 div 中加载该路由。

(我希望我解释得足够好,如果没有,请随时询问更多信息)

【问题讨论】:

    标签: asp.net javascript asp.net-mvc routes


    【解决方案1】:

    您 100% 正确地不想在您的 javascript 代码中对您的 URL 进行硬编码,因为这样做会破坏 MVC 的主要租户之一。我是那些“关注点分离”的人之一,他们不会在专用的 .js 文件之外编写单行 javascript,因此我无法像 tuanvt 那样动态指定 URL。我所做的是使用 MVCs Url.Action 方法将我的服务 URL 发送到母版页上的隐藏输入中(或者如果它没有在多个地方使用,则为特定页面)。然后我的脚本文件简单地将值从隐藏的输入中提取出来并很好地使用它。

    ASP.NET MVC 查看源代码

    <input id="serviceUrl" type="hidden" value="<%= Url.Action("Action", "Controller") %>" />
    

    JS 源码

    $.getJSON($("#serviceUrl").val(), function(data) {
        //write your JS success code here to parse the data
    });
    

    【讨论】:

      【解决方案2】:

      第一个挑战,当您使用 AJAX 加载部分页面时,您需要客户端可访问的 URL 以供 javascript 调用。第二个挑战,您需要能够加载 HomeController 并将 URL 的“页面”部分传递到 javascript 的 URL。

      对于第一个方面,我会为部分页面创建一些抽象路由,即“/ajaxaccess/{controller}/{action}/{id}”。那将是第一条注册路线。第二条路由将接受任何控制器/动作引用,并始终由 HomeController Index 动作处理。

      在 /Home/Index 操作中,您获取请求的 URL 并将其分割,获取 /{controller}/{action}/... 部分并使用 TempData 将其传递到您的 default.aspx。在您的页面中检查 TempData 是否存在,如果存在,请使用其中的值来触发部分页面的 AJAX 页面加载(不要忘记您需要在前面添加“/ajaxaccess”(或您选择的任何内容)在将 URL 传递到您的页面之前将其添加到 URL。

      我不打算在这里提供代码,因为我认为您从自己的工作中获得的信息对于您继续前进将是无价的。

      【讨论】:

      • 我会试试这个 Lazarus,非常有帮助的“答案”!
      【解决方案3】:

      您可以在您的网址上使用哈希锚 (#) 并使用 javascript 读取它。

      var url = document.location.toString();
      if (url.match('#')) {
        anchor = url.split('#');
        // do whatever with anchor[1] .. 
      }
      

      【讨论】:

      • 看到我有很多 javascript 调用而没有更改页面,因此 # 锚点通常会出现在 URL 中,即使它不是“要呈现的视图”。所以,虽然这也是我的第一个想法,但在这个开发阶段,这并不是一个真正的选择。
      【解决方案4】:

      你可以做这样的事情,把它放在你的javascript代码中:

      var szUrl=<%= ViewContext.RouteData.Route.ToString()%>;
      

      那么当前路线将被存储在变量szUrl中。

      【讨论】:

      • var szUrl = '@ViewContext.RouteData.Route.ToString()'; 在 ASP.NET MVC 5 中返回 var szUrl = 'System.Web.Routing.Route';,这是意料之中的。
      猜你喜欢
      • 2019-03-03
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多