短:
有没有办法让路由定义将“CONTROLLER / ACTION”字符串值传递给JavaScript函数,而不是直接为控制器直接操作动作?
更多:
我有一个包含网站导航的母版页。现在,所有页面都需要随时围绕它进行此导航,但由于我不希望每次页面调用都不断加载导航,因此我将所有页面都更改为了partialviews。
只要在导航中单击菜单项,就会通过JQuery.Load()方法加载这些部分视图。
这一切都非常好,直到现在,因为我注意到网站也要求能够直接链接到第X页,而不是default.aspx。
所以,举个例子:
主页面是我的“default.aspx”页面,它利用我的主页面及其周围的导航。每次调用新页面都使用一个javascript函数,将该特定局部视图加载到我的母版页中已知的div中。所以,网址永远不会改变“default.aspx”,但我的内容似乎发生了变化。
问题是,当直接输入地址栏时,这些网址也需要可用。但是,它们是部分视图,因此直接从地址栏加载它们会使它们在没有任何主页的情况下显示。因此我的问题是,是否可以捕获键入地址栏的路由并将其传递给我的JavaScript函数,该函数将在内容div中加载该路由。
(我希望我解释得不够,如果没有,请随时提出更多信息)
答案 0 :(得分:3)
100%正确无法在您的javascript代码中对您的网址进行硬编码,因为它会拆除MVC的主要租户之一。我是那些不会在专用的.js文件之外写一行javascript的“关注点分离”的人之一,因此我不能像tuanvt那样动态指定URL。我所做的是使用MVC 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
});
答案 1 :(得分:0)
您可以在网址上使用哈希锚(#)并使用javascript阅读。
var url = document.location.toString();
if (url.match('#')) {
anchor = url.split('#');
// do whatever with anchor[1] ..
}
答案 2 :(得分:0)
第一个挑战,因为您使用AJAX加载部分页面,您需要客户端可访问的URL以供javascript调用。第二个挑战,你需要加载HomeController的URL并将URL的'page'部分传递给javascript。
对于第一个方面,我将创建一些抽象路线,即部分页面的“/ ajaxaccess / {controller} / {action} / {id}”。这将是第一个注册的路线。第二个路由将接受任何控制器/操作引用,并始终由HomeController Index操作处理。
在/ Home / Index操作中,您获取请求的URL并将其切片,使用/ {controller} / {action} / ...部分并使用TempData将其传递到default.aspx。在你的页面中检查是否存在TempData,如果存在则使用其中的值来触发部分页面的AJAX页面加载(不要忘记你需要预先添加'/ ajaxaccess'(或者你选择的任何东西)在传递到您的页面之前的URL。
我不打算在这里提供代码,因为我认为通过自己完成这些工作所获得的信息对于您的前进将是非常宝贵的。
答案 3 :(得分:-1)
您可以执行以下操作,将其放在视图中的javascript代码中:
var szUrl=<%= ViewContext.RouteData.Route.ToString()%>;
然后当前路线将存储在变量szUrl
。