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

时间:2010-09-17 16:18:50

标签: ajax asp.net-mvc-2 jquery

所以我有我的第一个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代码中,这很容易。我只写了<%= Url.Action(“MyAction”)%>。但是我如何在我的javascript文件中执行此操作?

3 个答案:

答案 0 :(得分:1)

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

最佳解决方案是将操作URL包含在HTML文件中的某个位置,然后从JavaScript获取该值。我的建议是这样的:

<!-- in your view file  -->
<form id="MyForm" action="<%: Url.Action("MyAction") %>"> ... </form>

<!-- or -->
<a id="MyLink" href="<%: Url.Action("MyAction") %>"> ... </a>

结合

// 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时创建可降级的回退行为。

答案 1 :(得分:1)

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

外部Js文件

ShoppingCart = function() {
    this.settings = {
        AddProductToCartUrl: '',
        RemoveFromCartUrl: '',
        EmptyCartUrl: '',
        UpdateCartUrl: ''
    };
};

ShoppingCart.prototype.init = function(settings) {
    this.settings = jQuery.extend(this.settings, settings || {});
};

HTML /视图

<script type="text/javascript">
    var cart = new ShoppingCart();
    cart.init({ AddProductToCartUrl: '<%=Url.Action("MyAction")%>' });

    alert(cart.settings.AddProductToCartUrl);
</script>

答案 2 :(得分:0)

简单:告诉您的javascript正确的网址是什么。

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

  • 有一个服务器端生成的javascript“配置”,所以你可以做一些像var url = siteConfiguration.SITEROOT + 'products/pink-bunny-slippers'注意这个文件可以是一个普通的MVC视图,唯一的技巧是你必须告诉控制器发送{{1标题而不是text / html。
  • 基本上,依赖项会将其注入您的脚本。使用text/javascript
  • 等内容调用的function wireUpAjaxLinksToService(linkIdentifier, serviceEndpoint) IE