Url.Action无法找到控制器

时间:2017-07-28 20:11:30

标签: jquery asp.net-mvc razor jquery-ui-autocomplete

我有一个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和Autocomplete方法?

1 个答案:

答案 0 :(得分:3)

您不能在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);
            }
        });
    }
});