asp.net mvc jquery autocomplete不会激活控制器操作

时间:2011-01-15 01:13:12

标签: jquery asp.net-mvc

我有正确的jquery包含设置我相信,datepicker正在工作。但是,当我在控制器上为自动完成设置断点时,在文本框中键入时它永远不会被激活。我有:

    <script type="text/javascript">
    $(document).ready(function () {
        $("input#sitesearchlist").autocomplete('<%= Url.Action("Filter", "Wos") %>');
    });
    </script>

其中Filter是控制器Wos上的一个动作:

    public ActionResult Filter(string q)
    {
        var siteList = _sitesRepository.GetSites(q);
        return Json(siteList, JsonRequestBehavior.AllowGet);
        //return siteList;
    }

我意识到应该返回一个简单的列表而不是json与第一个代码段一起使用。最终我需要在数据中设置一个id而不是名称,所以这是一个简单的例子,试图解决当前的问题,这就是当我运行它时,没有从控制器动作中提取数据,当我设置断点时,它会在首次运行时触发,但不会在文本框中输入文本时触发:

    <%= Html.TextBox("sitesearchlist") %>

所以我认为java被激活为自动完成,因为在某些时候它似乎缓存了字母'ki',因为如果我输入它们,列表将出现在文本框下方,只有那些字母。但是,当你输入时,动作不会触发。

如果我访问网址,我会得到json数据,如:

[{"SiteId":153,"SiteName":"Name of Site"}]

所以出于某种原因,无论我尝试过什么,我都会以同样的方式陷入困境。 Autocomplete表示将java脚本放在页面的头部,这位于我的site.master中,文本框显然位于页面的下方。我想如果json数据即将到来(即使控制器断点从未命中)并且格式错误,我应该在列表中找到垃圾列表,是吗?谢谢你的任何建议!!!!

编辑:找到this优秀页面,最后得到以下内容:

    <script type="text/javascript">
    $(document).ready(function () {
        $("#tags").autocomplete({
            source: function (request, response) {
                $.ajax({
                    url: "/Wos/Filter", type: "POST", dataType: "json",
                    data: { searchText: request.term, maxResults: 10 },
                    success: function (data) {
                        response($.map(data, function (item) {
                            return { label: item.SiteName, value: item.SiteName, id: item.SiteId }
                        }))
                    }
                })
            },
            minLength: 3

        });
    });
</script>

    [HttpPost]
    public JsonResult Filter(string searchText, int maxResults)
    {
        var siteList = _sitesRepository.GetSites(searchText);
        return Json(siteList, JsonRequestBehavior.AllowGet);
    }

现在工作正常。如果没有完全理解这一点(刚刚开始使用java,你能说不出来吗?)看来请求/响应是什么诀窍。这必须是由于页面上引用的mvc2更改,我假设,因为这里引用的许多工作示例对我来说都不起作用,即使是一个简单的列表,但这样做。

3 个答案:

答案 0 :(得分:2)

尝试使用HttpPost属性修饰Filter函数,如下所示:

[HttpPost]
public ActionResult Filter(string q)
{
    var siteList = _sitesRepository.GetSites(q);
    return Json(siteList, JsonRequestBehavior.AllowGet);
    //return siteList;
}

答案 1 :(得分:1)

修改

实际上,您似乎没有正确使用自动填充功能。请参阅此处的示例 http://jqueryui.com/demos/autocomplete/#remote-jsonp

尝试做(希望括号和括号是正确的)

$("input#sitesearchlist").autocomplete({source: function(request, response) {
   $.getJSON('<%= Url.Action("Filter", "Wos") %>', {q: request.term}, function(data) {
       response($.map(data, function(item) {
           return {label: item.SiteName, value: item.SiteId};
       }));
   });
}});

答案 2 :(得分:0)

input#sitesearchlist是一个有效的jQuery选择器吗?可以肯定的是,我会给文本框一个id并运行一个jQuery选择器。

HTH