如何在javascript调用中处理Asp.net MVC URL?
我正试图在我的Asp.net MVC Web应用程序中编写一个javascript较多的部分(该网站的这部分是使用Extjs的RIA)。然而,我在javascript中正确处理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放
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>