Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何在外部JS函数中提到动作方法的路径?_Jquery_Asp.net Mvc 3 - Fatal编程技术网

Jquery 如何在外部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

我已经在外部JS文件中编写了一个jquery函数,并在需要的地方包含了该文件

在jquery函数中,我从控制器调用了action方法。现在我的问题是,我无法从外部JS找到该操作方法路径。这是投掷错误,是找不到这样的方法

现在,我如何在外部JS中编写操作路径名,它将在任何地方工作

我尝试了以下提及/调用操作方法-

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.');
            }

        });