如果在url中仅使用控制器名称查询mvc应用程序而未指定操作,则会呈现页面但是ajax / scripts不起作用,而在url中使用操作查询时,同一页面正在按预期工作。
不工作网址:http://localhost:port/Search - >页面渲染很好,但脚本不起作用 - 搜索结果没有显示
工作网址:http://localhost:port/Search/Index - >页面和脚本按预期工作 - 搜索结果显示
C#:
public class SearchController : Controller
{
private readonly List<string> _cars;
public SearchController()
{
_cars = new List<string>{"Corolla","Camry","Civic","Land Rover","Range Rover","Polo"};
}
public ActionResult Index()
{
return View();
}
public async Task<JsonResult> GetMatchingResults(string filter)
{
var results = await Task.Run(() => GetSearchResults(filter));
return new JsonResult() { Data = results,JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
private List<string> GetSearchResults(string filter)
{
var results = _cars.Where(car => car.Contains(filter));
return results.ToList();
}
}
HTML:
<html>
<head>
@using System.Web.Optimization
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
<meta name="viewport" content="width=device-width" />
<script src="~/Scripts/ApplicationScripts/SearchViewJS.js" type="text/javascript"></script>
<title>SearchView</title>
</head>
<body>
<div>
<input class="searchText" type="search" />
</div>
<div>
<input class="searchResults" type="text" />
</div>
</body>
</html>
JS:
$(document).ready(function () {
$(".searchText").on('input', function (event) {
var filter = $(event.currentTarget).val();
search(filter).then(display);
});
function search(filter) {
return $.getJSON('GetMatchingResults/', { 'filter': filter });
}
function display(result) {
$(".searchResults").val(result);
}
})
答案 0 :(得分:1)
这是因为
的背景$.getJSON('GetMatchingResults/', { 'filter': filter });
在第一个尝试命中/ GetMatchingResults的情况下,第二个尝试命中/ search / GetMatchingResults。修复可能是使用
$.getJSON('/search/GetMatchingResults/', { 'filter': filter });
或者更好的方法是从HTML助手生成路径,如果更新路由规则,该路径将正确路由。这看起来像
$.getJSON('@Url.Action("GetMatchingResults", "Search")', { 'filter': filter });