Url.Action 找不到控制器

Url.Action can't find controller

我有一个 Html 帮助程序,它定义了一个用于提供 jquery-ui 自动完成功能的文本框。

@Html.TextBox("txtSearchArg")

javascript 在 /Scripts 文件夹中。

    $("#txtSearchArg").autocomplete({
    source: function (request, response) {
        var clinician = new Array();
        $.ajax({
            cache: false,
            type: "POST",
            url: '@(Url.Action("Autocomplete", "Home"))'
            data: { "term": request.term },
            success: function (data) {
                alert("in success");
                response(clinician);
            },
            error: function (response) {
                alert(response.responseText);
            },
            failure: function (response) {
                alert(response.responseText);
            }
        });
    }
});

我正在使用@Url.Action方法 在我的 HomeController 中,我有一个自动完成方法。

[AcceptVerbs(HttpVerbs.Post)]
    public JsonResult Autocomplete(string term)
    {
        ... JSON gets created here
        return Json(result3, JsonRequestBehavior.AllowGet);
    }

当我像上面的代码一样将 url 参数传递给我的 $.ajax 方法时,响应是 404,未找到。在调试中,动态 js 显示为 "url: '/Home/Autocomplete'"。但是当我这样传递它时(从动态 js 复制):

url: '/Home/Autocomplete'

它发现 HomeController 自动完成方法很好。

如何使用 Url.Action 方法以便它找到 HomeController 和自动完成方法?

您不能在 javascript 文件中使用 Razor 语法。您需要将代码移动到视图中,以便正确呈现它。

一个可能的解决方案可能是这样的:

在您看来(例如 .cshtml 文件):

<script>
    var autoCompleteUrl = '@(Url.Action("Autocomplete", "Home"))';
</script>

然后在你的js中替换:

 $("#txtSearchArg").autocomplete({
    source: function (request, response) {
        var clinician = new Array();
        $.ajax({
            cache: false,
            type: "POST",
            url: autoCompleteUrl
            data: { "term": request.term },
            success: function (data) {
                alert("in success");
                response(clinician);
            },
            error: function (response) {
                alert(response.responseText);
            },
            failure: function (response) {
                alert(response.responseText);
            }
        });
    }
});