如何在外部JS函数中提到action of action方法?

时间:2012-10-08 10:46:00

标签: jquery asp.net-mvc-3

我在外部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"}))

第三个因为剃刀语法而无效。

如何解决此问题?

我在下面使用了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); }
            })

3 个答案:

答案 0 :(得分:1)

您可以将路径放在_Layout.cshtml中的某个位置,例如在body标签中,如下所示

<body data-jsactionurl="@Url.Action("Action", "Controller")">

然后你可以在你的JS文件中得到这个(jQuery):

var action = $("body").attr('data-jsactionurl');

或者甚至喜欢这样:

var action = $('body').data('jsactionurl')

答案 1 :(得分:1)

你在这里遇到的一个问题是可能需要使用全局;这可能容易受到脚本攻击。有关最天真的实现,请参阅我的原始答案。

我认为这可能非常安全 - 但是有更好的Javascript专家可能有更好的答案。

在你的布局/母版中,你可以像这样输出一个脚本块(我正在使用Razor):

<script>
  function myActionMethods(){
    this.MyActionMethod = function(){
      return '@Url.Action("Action", "Controller")';
    };
  }
</script>

然后在之后包含您的脚本,使用以下内容:

var methods = new myActionMethods();
$.get(methods.MyActionMethod());

当您需要在脚本中使用该URI时(仅使用jQuery Get进行演示)。

回应您对@ David回答的评论

不确定;你可以使用Razor来输出JS:只需编写一个控制器动作来激活一个返回javascript的Razor视图(虽然你必须对响应类型进行一些调整)但如果你这样做会丢失所有的缓存/压缩该脚本的好处,然后你必须再次写回来。

答案 2 :(得分:0)

嗨,你可以这样使用它在下面

url: "@Url.Content("~/City/State")"

在该网址中首先是您的控制器名称,然后是您的操作名称

在我的项目中,我正在使用这个

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

        });

我认为这会让你感到高兴......