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 });