2013-09-29 23 views
1

我有工作自動完成。我的搜索方法位於HomeController中,但我想做一些更改。我創建了一個名爲「空缺」的API控制器,並在那裏傳輸了搜索方法,但是我無法使其工作:狀態碼:404 Not Found(搜索方法甚至沒有啓動)。 transfering我所做的所有修改後爲:在查看自動完成,源鏈接問題(MVC,敲除)

修改後的源鏈接:

data-autocomplete="@Url.Action("Search", "Vacancy")" 

更改搜索方法:

public object Search(string term) 
    { 
     var vacancyHeaders = 
      new UnitOfWork().Repository<Vacancy>() 
          .Get() 
          .Where(v => v.Header.ToLower().Contains(term.ToLower())) 
          .Select(v => new { label = v.Header }) 
          .Distinct() 
          .Take(10); 
     return vacancyHeaders; 
    } 

請幫助,爲什麼我的搜索方法不開始? 下面是無API控制我的工作代碼:

查看:

<form data-bind="submit: search"> 
     <input data-bind="value: SearchArgument, valueUpdate: 'blur'" data-autocomplete="@Url.Action("Search", "Home")" class="form-text" name="search" size="32" maxlength="64" placeholder="Search"/> 
     <input type="submit" value="search" /> 
</form> 

腳本

$(":input[data-autocomplete]").each(function() { 
       $(this).autocomplete({ source: $(this).attr("data-autocomplete")}); 

      }); 

搜索方法

public ActionResult Search(string term) 
    { 
     var vacancyHeaders = 
      new UnitOfWork().Repository<Vacancy>() 
          .Get() 
          .Where(v => v.Header.ToLower().Contains(term.ToLower())) 
          .Select(v => new { label = v.Header }) 
          .Distinct() 
          .Take(10); 
     return Json(vacancyHeaders, JsonRequestBehavior.AllowGet); 
    } 
+0

也許嘗試添加[HttpPost]標題到您的搜索方法? –

+0

Norbert Pisz,謝謝,但仍然狀態代碼:404 Not Found(((((( – Roman

+0

)您確定發佈的請求的簽名與操作方法相匹配嗎?我最好的猜測是您不會在您的請求。 –

回答

0

如果您想在Web API中使用自定義方法名稱,則需要更改路由配置以允許它。

Custom method names in ASP.NET Web API問題,這裏有一個例子,你如何配置你的WebApiConfig文件納入額外的GET方法和支持正常的休息方法:

config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" }); 
config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}"); 
config.Routes.MapHttpRoute("DefaultApiGet", "Api/{controller}", new { action = "Get" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }); 
config.Routes.MapHttpRoute("DefaultApiPost", "Api/{controller}", new { action = "Post" }, new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) }); 

現在你可以讓你的搜索方法是這樣的:

public IQueryable GetAutocompleteResponse(string term = null) 
{ 
    var someStrings = new string[] { "vacancy1", "vacancy2" }; 

    var model = someStrings.Select(c => new { label = c }).AsQueryable(); 

    return model; 
} 

最後這裏是我用來測試它的代碼,使用jQueryUI的自動完成:

<input type="search" name="searchTerm" data-autocomplete="@Url.Action("GetAutocompleteResponse", "Api/Vacancy")" /> 
<input type="submit" id="submitForm" value="Search By Name" /> 


@section scripts 
{ 
    <script> 
     var createAutocomplete = function() { 
      var self = $(this); 
      var options = { 
       source: self.attr("data-autocomplete") 
      }; 
      self.autocomplete(options); 
     } 

     $(document).ready(function() { 
      $("input[data-autocomplete]").each(createAutocomplete); 
     }); 
    </script> 
}