ASP.Net MVC脚本不使用控制器的默认操作URL。同样使用控制器/动作网址

时间:2015-03-15 10:44:33

标签: javascript ajax asp.net-mvc url action

如果在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);
    }
})

1 个答案:

答案 0 :(得分:1)

这是因为

的背景
$.getJSON('GetMatchingResults/', { 'filter': filter });

在第一个尝试命中/ GetMatchingResults的情况下,第二个尝试命中/ search / GetMatchingResults。修复可能是使用

$.getJSON('/search/GetMatchingResults/', { 'filter': filter });

或者更好的方法是从HTML助手生成路径,如果更新路由规则,该路径将正确路由。这看起来像

$.getJSON('@Url.Action("GetMatchingResults", "Search")', { 'filter': filter });