我正在尝试编写我的Asp.net MVC Web App的javascript部分(该部分网站是使用Extjs的RIA)。但是,我已经以正确的方式处理了javascript中处理URL的问题。
例如,现在我对List
中的ObjectsController
操作进行了Ajax调用,该操作位于Reading
区域。 List操作采用documentId
(int)参数。截至目前,这已映射到/Reading/Objects/List
,因为我还没有更改路由(此时网站太小,无法完成路由)。通常在视图中,要将此URL放在字符串中,我会@Html.Action("List", "Objects", new { area = "Reading", documentId = 3)
。
然而,这在处理javascript时不起作用,因为javascript不是由viewengine解析的。
为了解决这个问题,我有一个非常小的视图,它返回在我的主应用程序的js文件之前加载的javascript常量,例如URL。问题是我无法为此操作调用Html.Action
,因为在不断创建时我(显然)不知道ajax调用将是什么文档,以及是否从中排除documentId
Html.Action
调用异常发生。 documentId可以在应用程序的正常工作流程中更改。
我该如何处理?我不想将URL硬编码到/Reading/Objects/List
,因为如果我为此更改路由(对于更友好的用户友好的json API),或者此Web应用程序未托管在域的根目录上,则URL将不再有效。
其他人如何在他们的javascript调用中处理MVC URL?
答案 0 :(得分:6)
这是我一直在使用的安全技术。即使您的路线发生变化,您的JavaScript也会自动符合新路线:
<script>
var url = '@Url.Action("List", "Objects", new { area = "Reading", documentId = "_documentId_")';
var id = 100;
var finalUrl = url.replace('_documentId_', id);
</script>
“_documentId_
”本质上是一个虚拟占位符。然后在我的JavaScript中,一旦我知道它是什么,我用适当的id值替换“_documentId_
”。这样,无论您的路由配置如何,您的网址都会符合。
更新:12月20日
我刚刚看到这篇有趣的博文。作者构建了一个库,允许您使用VisualStudio中的intellisense支持在JavaScript文件内部构建路径。
http://weblogs.asp.net/zowens/archive/2010/12/20/asp-net-mvc-javascript-routing.aspx
答案 1 :(得分:2)
我个人使用不引人注目的javascript并避免使用javascript混合标记。通常通过单击某些按钮或链接来触发AJAX调用:
@Html.ActionLink("click me", "List", "Objects",
new { area = "Reading", documentId = 3 }, new { id = "foo" })
然后在一个单独的js文件中,我将附加并处理onclick事件(例如jquery):
$(function() {
$('#foo').click(function() {
$('#resultDiv').load(this.href);
return false;
});
});
我可以在javascript文件中使用任何硬编码的URL。 URL应始终由路由引擎处理,并使用html帮助程序生成。
如果它是<form>
而不是链接,我只会处理onsubmit
事件(以相同的方式),并使用表单的action
属性来获取网址。
更新:
在评论部分指出,只有客户端才知道documentId,你可以这样做:
@Html.ActionLink("click me", "List", "Objects",
new { area = "Reading" }, new { id = "foo" })
然后:
$(function() {
$('#foo').click(function() {
$('#resultDiv').load(this.href, { documentId: '123' });
return false;
});
});
答案 2 :(得分:0)
事实证明,使用Url.Action()
代替Html.Action()
解决了这个问题。 Url.Action()
(到目前为止)允许我生成没有所有参数的URL。我假设这只有在路由未指定目标URL本身的参数时才有效。