ASP.Net MVC 脚本无法使用控制器的默认操作 url。同样与 controller/action url 一起工作
ASP.Net MVC Scripts not working with controller's default action url. Same is working with controller/action url
当在 url 中单独使用控制器名称查询 mvc 应用程序而不指定操作时,页面已呈现但 ajax/scripts 不工作,而在 ajax/scripts 中使用操作查询时相同的页面=33=],正在按预期工作。
不工作 url:http://localhost:port/Search --> 页面呈现正常但脚本不工作 - 搜索结果不显示
正在工作 url: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);
}
})
是因为
的上下文
$.getJSON('GetMatchingResults/', { 'filter': filter });
在第一种情况下,将尝试命中 /GetMatchingResults,第二种情况将尝试命中 /search/GetMatchingResults。一个解决办法是使用
$.getJSON('/search/GetMatchingResults/', { 'filter': filter });
或者更好的方法是从 HTML 帮助程序生成路径,如果您更新路由规则,该路径将正确路由。这看起来像
$.getJSON('@Url.Action("GetMatchingResults", "Search")', { 'filter': filter });
当在 url 中单独使用控制器名称查询 mvc 应用程序而不指定操作时,页面已呈现但 ajax/scripts 不工作,而在 ajax/scripts 中使用操作查询时相同的页面=33=],正在按预期工作。
不工作 url:http://localhost:port/Search --> 页面呈现正常但脚本不工作 - 搜索结果不显示
正在工作 url: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);
}
})
是因为
的上下文$.getJSON('GetMatchingResults/', { 'filter': filter });
在第一种情况下,将尝试命中 /GetMatchingResults,第二种情况将尝试命中 /search/GetMatchingResults。一个解决办法是使用
$.getJSON('/search/GetMatchingResults/', { 'filter': filter });
或者更好的方法是从 HTML 帮助程序生成路径,如果您更新路由规则,该路径将正确路由。这看起来像
$.getJSON('@Url.Action("GetMatchingResults", "Search")', { 'filter': filter });