使用没有路由值的Url.Action会截断URL

时间:2011-05-23 14:25:48

标签: asp.net-mvc-3 urlhelper

我有一个使用大量使用AJAX的网站,并且为了让Urls保持在合理的位置,我在页面上的脚本块中输出所需的Urls,然后使用它们稍后在Javascript文件中。

这方面的一个例子是:

在Index.cshtml中

<script>
    if (!app.frontoffice)
        app.frontoffice = {};
    if (!app.frontoffice.urls)
        app.frontoffice.urls = {};

    if (!app.frontoffice.urls.index)
        app.frontoffice.urls.index = "@Url.Action("index", "frontoffice", new { area = string.Empty, id = string.Empty })";
</script>

在某个地方的JS文件中

$(function() {
    $("myButton").click(function(e) {
        $.ajax({
            url: app.frontoffice.urls.index,
            data: {
                id: 55
            },
            success: ...
            error: ...
        });
    });
});

问题是生成的Url是这样创建的 - /frontoffice,请注意它不包括index操作。这是因为在生成它时我们给它一个空的id,所以当我们使用它时,获取请求的Url实际上是/frontoffic/55', not / frontoffice / index / 55'..

UrlHelper似乎是从网址剔除动作名称。是否有其他方法可以使用,不会从Url中删除项目? - 我希望能够找到一个清晰,可重复使用的解决方案,因为这种事情发生在整个网站上。

感谢
基隆

2 个答案:

答案 0 :(得分:2)

您可以使用占位符作为ID。

app.frontoffice.urls.index = function (id) {
    return "@Url.Action("index", "frontoffice", new { id = "000" })".replace('000', id);
}

然后在.js文件中

$(function() {
    $("myButton").click(function(e) {
        $.ajax({
            url: app.frontoffice.urls.index(55),
            success: ...
            error: ...
        });
    });
});

答案 1 :(得分:0)

这可能需要在您的路线定义中处理。您可能仍然有这样的定义:

routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional});

对于其中一个,我可能会将其删除或放置一些明确定义您在默认路由定义之上生成的URL的内容。

相关问题