2017-07-28 104 views
1

我有一个Html助手,它定义了一个用于提供jquery-ui自动完成的文本框。Url.Action找不到控制器

@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方法?

+0

你加[httpPost]? –

回答

2

您不能在JavaScript文件中使用剃须刀语法。您需要将代码移到视图中,以便正确渲染。

一个可能的解决办法是这样的:在你看来

(例如.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); 
      } 
     }); 
    } 
});