使用Jquery / AJAX时如何获取MVC操作的正确URL?

所以我有我的第一个MVC2网站,我正在努力,我自然想在那里抛出一些AJAX。 问题是,我在传递URL参数时不知道如何获取操作的URL。 让我解释。 到目前为止我看到的示例显示开发人员传递的字符串如’/ MyController / MyAction’。 这很好,除非您的控制器不在您网站的根目录中(在我的情况下就是如此)。 我总是可以使用像’MyAction’这样的相对URL,除非URL包含不起作用的参数。 考虑http://example.com/myroot/MyController/MyAction vs http://example.com/myroot/MyController/MyAction/PageNumber/SomeOtherValue 。 现在相对URL将不正确。

在ASPX代码中,这很容易。 我只是写。 但是我如何在我的javascript文件中执行此操作?

这是长期存在的问题的一部分,包括JavaScript文件中的服务器端代码实际上是不可能的:(。(没有严重的黑客攻击,即。)

最好的解决方案是在某处将HTML中的操作URL包含在内,然后从JavaScript中获取该值。 我的建议是这样的:

  
"> ...
"> ...

结合

 // In your .js file $("#MyForm").submit(function () { $.post($(this).attr("action"), data, function (result) { /* ... */ }); return false; }); // or $("#MyLink").click(function () { $.getJSON($(this).attr("href"), data, function (result) { /* ... */ }); return false; }); 

这对我来说在语义上很清楚,并且在某些情况下甚至会在JavaScript关闭时创建可降级的回退行为。

您不能直接在JavaScript文件中执行此操作,但是您可以通过脚本初始化程序将这些动态值传递到脚本中。 请考虑以下示例:

外部Js文件

 ShoppingCart = function() { this.settings = { AddProductToCartUrl: '', RemoveFromCartUrl: '', EmptyCartUrl: '', UpdateCartUrl: '' }; }; ShoppingCart.prototype.init = function(settings) { this.settings = jQuery.extend(this.settings, settings || {}); }; 

HTML /查看

  

简单:告诉你的javascript正确的URL是什么。

从战术上讲,你可以通过很多方式实现目标,但它们基本上分为两种技术:

  • 有一个服务器端生成的javascript“配置”,所以你可以做一些像var url = siteConfiguration.SITEROOT + 'products/pink-bunny-slippers'注意这个文件可以是一个普通的MVC视图,唯一的技巧是你必须告诉控制器发送text/javascript标头而不是text / html。
  • 基本上,依赖将它注入到您的脚本中。 IE function wireUpAjaxLinksToService(linkIdentifier, serviceEndpoint) ,使用诸如wireUpAjaxLinks('a.ajax', '<%= Url.Action("MyService", "Services") %>')东西调用