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

如何在javascript调用中处理Asp.net MVC URL?,javascript,asp.net-mvc,ajax,Javascript,Asp.net Mvc,Ajax,我正试图在我的Asp.net MVC Web应用程序中编写一个javascript较多的部分(该网站的这部分是使用Extjs的RIA)。然而,我在javascript中正确处理URL的方法上遇到了瓶颈 例如,现在我在ObjectsController中有一个对列表操作的Ajax调用,它位于读取区域。列表操作的参数为documentId(int)。到目前为止,这映射到/Reading/Objects/List,因为我还没有更改路由(该站点目前还太年轻,无法确定路由)。通常在视图中,要将这个URL放

我正试图在我的Asp.net MVC Web应用程序中编写一个javascript较多的部分(该网站的这部分是使用Extjs的RIA)。然而,我在javascript中正确处理URL的方法上遇到了瓶颈

例如,现在我在
ObjectsController
中有一个对
列表
操作的Ajax调用,它位于
读取
区域。列表操作的参数为
documentId
(int)。到目前为止,这映射到
/Reading/Objects/List
,因为我还没有更改路由(该站点目前还太年轻,无法确定路由)。通常在视图中,要将这个URL放在字符串中,我会执行
@Html.Action(“List”,“Objects”,new{area=“Reading”,documentId=3)

但是,这在处理javascript时不起作用,因为javascript不是由viewengine解析的

为了解决这个问题,我有一个非常小的视图,它返回javascript常量,比如URL,这些常量是在我的主应用程序的js文件之前加载的。问题是我不能为这个操作调用
Html.Action
,因为在常量创建时我(显然)不知道ajax调用将是什么documentId,如果从
Html.Action
调用中排除
documentId
,则会发生异常。documentId可能会在应用程序的正常工作流中更改

如何处理此问题?我不想将URL硬编码为
/Reading/Objects/List
,因为如果我为此更改路由(以获得更用户友好的json API),或者此web应用程序未托管在域的根目录上,则URL将不再有效


其他人在javascript调用中如何处理MVC URL?

我个人使用不引人注目的javascript,避免将标记与javascript混合。AJAX调用通常通过单击某些按钮或链接触发:

@Html.ActionLink("click me", "List", "Objects", 
    new { area = "Reading", documentId = 3 }, new { id = "foo" })
然后在一个单独的js文件中,我将附加并处理onclick事件(例如jquery):

正如您所能看到的,我不需要在javascript文件中使用任何硬编码URL。URL应该始终由路由引擎处理,并使用html帮助程序生成

如果它是一个
而不是一个链接,我只需处理
onsubmit
事件(以相同的方式),并使用表单的
action
属性来获取URL


更新:

在评论部分指出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;    
    });
});

事实证明,这一切都是通过使用
Url.Action()
而不是
Html.Action()
Url.Action()
is(到目前为止)解决的允许我在不使用所有参数的情况下生成URL。我假设这仅在路由未在目标URL本身中指定参数时有效。

我一直在使用一种安全的技术。即使路由发生更改,JavaScript也会自动符合新路由:

<script>
var url = '@Url.Action("List", "Objects", new { area = "Reading", documentId = "_documentId_")';
var id = 100;
var finalUrl = url.replace('_documentId_', id);
</script>

var url='@url.Action(“List”,“Objects”,new{area=“Reading”,documentId=“\u documentId”);
var-id=100;
var finalUrl=url.replace(“文档id”);
\u documentId\u
”本质上是一个虚拟占位符。然后在我的JavaScript中,一旦我知道“
\u documentId\u
”是什么,我就用正确的id值替换它。这样,无论您的路由如何配置,您的URL都将保持一致


更新:12月20日

我刚刚看到了这篇有趣的博文。作者构建了一个库,允许您使用VisualStudio中的intellisense支持在JavaScript文件中构建路由


看看这个问题的答案。我想这就是你需要的。
列表
操作方法是否也返回可以用于进一步ajax调用的
documentId
?我不确定该链接有何帮助,因为在代码生成URL时,它没有参数信息,因此我将使用相同的issue,除非
Url.RouteUrl()
可以在没有参数的情况下形成Url(回家后值得一试)。
列表
操作返回JSON,其中包含与特定
documentId
OP相关的对象的Id和名称,
documentId
操作参数值位于
ActionLink()
被调用。由于我正在创建一个仅使用javascript的RIA,因此这不是一个选项。GUI和将通过javascript创建的GUI部分,因此是ActionLink。正如Crescent Fresh指出的,在使用视图引擎时,我不知道在使用ajax调用时将使用什么documentId。@KallDrexx,对不起,我误解了您的问题。我已经更新了我的答案以考虑到这一点。然后,您可以在生成链接时排除这些参数,并在执行AJAX请求时将它们作为附加参数传递。我必须对此进行测试,但我认为这不会起作用。当我执行
@Html.Action()时
如果没有
documentId
字段,视图引擎会崩溃,因为它需要此路由的
documentId
,因为它是操作的必需参数。我不想让JSON操作的所有参数都是可选的,因为这意味着我必须对每个问题进行更多的错误检查他是URL抽象的唯一目的。事实上,这是一个有趣的想法!我想补充一点,如果你想在你的URL.action中访问mvc模型值,那么你需要在.cshtml页面上而不是在外部js文件中这样做:var URL='@URL.action(“action”,“Controller”,new{Name=@model.Name});
<script>
var url = '@Url.Action("List", "Objects", new { area = "Reading", documentId = "_documentId_")';
var id = 100;
var finalUrl = url.replace('_documentId_', id);
</script>