我应该如何在javascript调用中处理Asp.net MVC URL?

时间:2010-11-24 04:33:03

标签: javascript asp.net-mvc ajax

我正在尝试编写我的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?

3 个答案:

答案 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本身的参数时才有效。