Jquery 如何在外部JS函数中提到动作方法的路径?
我已经在外部JS文件中编写了一个jquery函数,并在需要的地方包含了该文件 在jquery函数中,我从控制器调用了action方法。现在我的问题是,我无法从外部JS找到该操作方法路径。这是投掷错误,是找不到这样的方法 现在,我如何在外部JS中编写操作路径名,它将在任何地方工作 我尝试了以下提及/调用操作方法-Jquery 如何在外部JS函数中提到动作方法的路径?,jquery,asp.net-mvc-3,Jquery,Asp.net Mvc 3,我已经在外部JS文件中编写了一个jquery函数,并在需要的地方包含了该文件 在jquery函数中,我从控制器调用了action方法。现在我的问题是,我无法从外部JS找到该操作方法路径。这是投掷错误,是找不到这样的方法 现在,我如何在外部JS中编写操作路径名,它将在任何地方工作 我尝试了以下提及/调用操作方法- 1. url: "/Employee/AutocompleteSuggestions" 2. url: "AutocompleteSuggestions" 3. @Html.Ra
1. url: "/Employee/AutocompleteSuggestions"
2. url: "AutocompleteSuggestions"
3. @Html.Raw(Url.Action("AutocompleteSuggestions", "Employee", new { @term = "Term", @moduleName="ModuleName"}))
由于razor语法,3rd无法工作
如何解决这个问题
我使用的JS如下所示-
$.ajax({
url: "AutocompleteSuggestions",
dataType: "json",
contentType: "application/json; charset=utf-8",
type: "POST",
data:
JSON.stringify({
term: request.term,
moduleName: "Employee"
}),
success: function (data) {
response($.map(data, function (item) {
return { label: item.FullName, value: item.Id }
}
))
},
error: function (xhr, ajaxOptions, thrownError) { alert(thrownError); }
})
您可以将操作的路径放在_Layout.cshtml中的某个位置,例如在body标记中,如下所示
<body data-jsactionurl="@Url.Action("Action", "Controller")">
甚至像这样:
var action = $('body').data('jsactionurl')
var methods = new myActionMethods();
$.get(methods.MyActionMethod());
你在这里遇到的一个问题是,你可能需要使用一个全局变量;它可能容易受到脚本攻击。请参阅我的原始答案,了解最简单的实现 我认为这可能是相当安全的——但是有更好的Javascript大师可能会有更好的答案 在layout/master中,您只需输出一个脚本块,如下所示:我正在使用Razor:
<script>
function myActionMethods(){
this.MyActionMethod = function(){
return '@Url.Action("Action", "Controller")';
};
}
</script>
当您需要在脚本中使用该URI时,请在这里使用jQuery Get进行演示
回应您对@David的回答的评论
当然;您可以使用Razor输出JS:只需编写一个控制器操作,启动一个Razor视图,返回javascript,尽管您需要对响应类型进行一些修改,但如果这样做,您将失去该脚本的所有缓存/压缩优势,然后您必须重新编写这些内容。您好,您可以这样使用在下面
url: "@Url.Content("~/City/State")"
在该url中,首先是控制器名称,然后是操作名称
在我的项目中,我是这样使用的
$.ajax({
url: "@Url.Content("~/City/State")",
dataType: 'json',
data: { countryId: countryID },
success: function (data) {
alert(data);
$("#stateID").empty();
$("#stateID").append("<option value='0'>--Select State--</option>");
$.each(data, function (index, optiondata) {
alert(optiondata.StateName);
$("#stateID").append("<option value='" + optiondata.ID + "'>" + optiondata.StateName + "</option>");
});
},
error: function () {
alert('Faild To Retrieve states.');
}
});
我想这会帮你…谢谢。不可能将其写入JS文件本身吗?我知道这个解决办法。但是我想把它保存在外部文件中。还有其他方法,但我认为这是我所知道的最好的方法。如果你想让它和你的javascript放在同一个文件中,你可以把你所有的脚本放在partialview而不是.js文件中。我从外部js文件中添加了jquery函数的部分代码。谢谢。那么请帮我一个忙,对于上述问题,哪一个是更好的解决方案?我想我有点建议了哪一个我更喜欢,不是吗?除非您将其写回,否则丢失缓存和压缩等是不可取的。我的解决方案简单地介绍给您的整个站点,并从中调用主视图和局部视图,然后您只需假设myActionMethods对象已经定义。还有一件事是,我在一个JS文件中添加了多个函数,就像我在上面代码中提到的那样,这些函数将需要来自不同控件和操作方法的操作方法路径。那么,在我的例子中,我如何使用上述解决方案呢?嗯,Url.Action接受所有路由值——所以这不是问题,是吗?只要确保你在对象上给他们的名字是不同的,不管怎样,他们应该是不同的。我会尝试你的建议,如果有任何问题,然后让你知道。但在我的项目中,它工作的是你使用虚拟目录吗?我在外部JS文件中使用了jquery,所以它没有执行Razor语法。
$.ajax({
url: "@Url.Content("~/City/State")",
dataType: 'json',
data: { countryId: countryID },
success: function (data) {
alert(data);
$("#stateID").empty();
$("#stateID").append("<option value='0'>--Select State--</option>");
$.each(data, function (index, optiondata) {
alert(optiondata.StateName);
$("#stateID").append("<option value='" + optiondata.ID + "'>" + optiondata.StateName + "</option>");
});
},
error: function () {
alert('Faild To Retrieve states.');
}
});