JQuery UI 自动完成未达到 ActionResult C# MVC

Posted

技术标签:

【中文标题】JQuery UI 自动完成未达到 ActionResult C# MVC【英文标题】:JQuery UI Autocomplete not reaching ActionResult C# MVC 【发布时间】:2017-07-05 05:55:10 【问题描述】:

我已经阅读了许多具有相同问题的帖子,但没有任何帮助,因此对重复的问题表示歉意:(我按照 JQueryUI 网站上的简单示例通过硬编码值和自动完成工作,但我需要它来自我的数据库。

查看:

@html.TextBoxFor(model => model.Position, new  @type = "text", @id = "jobtitle", @name = "jobtitle", @placeholder = "Job Title" )

JS:

编辑:我添加了成功警报,并且正在调用警报,但没有数据(即没有从数据库中提取数据)

<script>
$(function () 
            $("#jobtitle").autocomplete(
                source: function (request, response) 
                    $.ajax(
                        url: '@Url.Action("JobsAutoFill", "Account")',
                        data: 
                            Prefix: request.term
                        ,
                        success: function (data) 
                            alert(data);
                            response(data);
                        
                    );
                ,
                minLength: 1
            );

            //$("#jobtitle").autocomplete(
            //    source: "/Account/JobsAutoFill/"
            //);
        );
</script>

我已经添加了所需的链接:

<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

下面是我的 ActionResult(实际上是一个 JsonResult) & 拉出 Jobs 列表的函数:

    public List<Jobs> GetAllJobs()
    
        List<Jobs> JobsList = new List<Jobs>();

        using (RBotEntities EF = new RBotEntities())
        
            var JobsListQuery = (from ED in EF.EmploymentDetails
                                   select new
                                   
                                       ED.pkiEmploymentDetailID,
                                       ED.Position
                                   );

            foreach (var item in JobsListQuery)
            
                JobsList.Add(new Jobs
                
                    Id = item.pkiEmploymentDetailID,
                    Name = item.Position
                );
            
        

        return JobsList;
    

public JsonResult JobsAutoFill(string Prefix)
        
            //Note : you can bind same list from database  


            List<Jobs> ObjList = new List<Jobs>();

            ObjList = GetAllJobs();

            //Searching records from list using LINQ query  


            var JobNames = (from N in ObjList
                            where N.Name.StartsWith(Prefix)
                            select new  N.Name );
            return Json(JobNames, JsonRequestBehavior.AllowGet);
        

我是否遗漏了什么或做错了什么?

感谢任何帮助,谢谢!

【问题讨论】:

有谁能帮忙吗? 暂时忽略 jquery。这是一个 GET 方法。尝试从 Web 浏览器访问它。它有效吗? Jobs 是可序列化的吗?你能在服务器上打断点吗?另外,“数据”对象里面是什么?也试试 data.Data 我现在可以访问控制器并看到作业已返回,但现在它没有显示(我只看到弹出的小框没有文本)。我试过 data.Data 它说未定义。 你的绑定错误。 最好从服务器返回正确的模型。客户端没有理由“映射”这些值 【参考方案1】:

我搞定了!

导致问题的第一件事是我需要在我的 ActionResult 上方添加 [AllowAnonymous]。

其次,我将 Ajax 调用更改为:

$(function () 
    $("#jobtitle").autocomplete(
        source: function (request, response) 
            $.ajax(
                url: '@Url.Action("JobsAutoFill", "Account")',
                data: 
                    Prefix: request.term
                ,
                success: function (data) 
                    response($.map(data, function (obj) 
                        return 
                            label: obj.Name,
                            value: obj.Name
                        ;
                    ));
                
            );
        ,
        minLength: 1
    );
);

下面是我的 ActionResult。我添加了一个可以区分大小写的更改:

[AllowAnonymous]
public JsonResult JobsAutoFill(string Prefix)

    //Note : you can bind same list from database  


    List<Jobs> ObjList = new List<Jobs>();

    ObjList = GetAllJobs();

    //Searching records from list using LINQ query  


    var JobNames = (from N in ObjList
                    where N.Name.ToLower().StartsWith(Prefix.ToLower())
                    select new  N.Name );
    return Json(JobNames, JsonRequestBehavior.AllowGet);

【讨论】:

【参考方案2】:

Dont Change 允许匿名更改您的 ajax 调用,就像在查询字符串中传递您的参数一样,这将影响您的后端函数。希望对你有帮助

$(function () 
$("#jobtitle").autocomplete(
    source: function (request, response) 
        $.ajax(
            url: '@Url.Action("JobsAutoFill", "Account")?Prefix='+$("#jobtitle").val(),
            data: 
                Prefix: request.term
            ,
            success: function (data) 
                response($.map(data, function (obj) 
                    return 
                        label: obj.Name,
                        value: obj.Name
                    ;
                ));
            
        );
    ,
    minLength: 1
);

);

【讨论】:

【参考方案3】:

如果它不必具有公共访问权限,则不应将其设为 AllowAnonymous。 其次,更改您的查询以获得更好的性能:

var JobNames = (from N in ObjList
                where N.Name.ToLower().StartsWith(Prefix.ToLower())
                select N.Name);

显然你需要返回一个字符串数组。但是您的代码返回了一个具有单个字符串属性的对象数组。

并根据更新更改您的脚本代码:

success: function (data) 
                    response($.map(data, function (obj) 
                        return 
                            label: obj,
                            value: obj
                        ;
                    ));
                

【讨论】:

以上是关于JQuery UI 自动完成未达到 ActionResult C# MVC的主要内容,如果未能解决你的问题,请参考以下文章

jQuery UI 自动完成 - 未找到结果

无法使用 HTML 设置未定义的 jQuery UI 自动完成的属性“_renderItem”

自动完成下拉菜单未正确显示

在 jquery ui 自动完成中允许 null

首次加载页面时,Jquery UI 自动完成功能不起作用

未捕获的 TypeError: $(...).autocomplete 不是 JQuery-UI 中的函数