2

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

由于剃刀语法,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); }
            })
4

3 回答 3

1

您可以将操作的路径放在 _Layout.cshtml 中的某个位置,例如像这样的 body 标记

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

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

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

甚至像这样:

var action = $('body').data('jsactionurl')
于 2012-10-08T10:52:39.153 回答
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 视图(尽管您必须对响应类型进行一些处理)但是如果您这样做,您将丢失所有缓存/压缩对那个脚本有好处,然后你必须把它全部写回去。

于 2012-10-08T10:53:13.810 回答
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.');
            }

        });

我想这会帮助你...

于 2012-10-08T11:19:31.420 回答