C#将控制器数据返回到JSONP输出以进行自动完成[重复]

Posted

技术标签:

【中文标题】C#将控制器数据返回到JSONP输出以进行自动完成[重复]【英文标题】:C# Return Controller data to JSONP output for autocomplete [duplicate] 【发布时间】:2016-06-28 18:34:11 【问题描述】:

我在将 C# MVC 中的控制器数据输出到 JSONP 以与 JQuery 自动完成一起使用时遇到了一些困难。我想要做的就是获取 2 个参数和一个回调以使 JSONP 工作,并且查询会根据搜索返回可用的匹配课程标题。

CourseController.cs

    public JsonResult GetPredictiveCourseTitleSearchResults()
    
        var jsonbuilder = "";
        var q = HttpContext.Request.Params["q"];
        var year = HttpContext.Request.Params["year"];
        var callback = HttpContext.Request.Params["callback"];
        var model = new courseModel
        
            SearchList = GetCourses(q,year)
        ;
        var results = model.SearchList.Items.ToList();
        int count = results.Count();
        int resultCount = 0;

        if (callback != "")
        
            jsonbuilder += callback + "(";
        
        jsonbuilder += "[";
        foreach(var result in results)
        

            if(resultCount+1 == count)
            
                jsonbuilder += "\"title\":" + "\"" + result.Fields["title"].ToString() + "\"";
            
            else
            
                jsonbuilder += "\"title\":" + "\"" + result.Fields["title"].ToString() + "\",";
            

            resultCount++;
        
        jsonbuilder += "]";
        if (callback != "")
        
            jsonbuilder += ")";
        
        return Json(jsonbuilder, JsonRequestBehavior.AllowGet);
    

CourseModel.cs

public class courseModel

    public ListModel<Item> SearchList  get; set; 
    public string title  get; set; 


App.js

 $("#course_search_input")
     .bind("keydown", function (event) 
         if (event.keyCode === $.ui.keyCode.TAB &&
             $(this).autocomplete("instance").menu.active) 
             event.preventDefault();
         
     )
    .autocomplete(
        source: function( request, response ) 
            $.ajax(
                url: "http://leedsbeckett/search/getpredictivecoursetitlesearchresults/",
                dataType: "jsonp",
                type: "POST",
                data: 
                    q: request.q,
                    year: $("#selectedyear").val()
                ,
                success: function (data) 
                    response( $.map( data.stuff, function ( item ) 
                        return 
                            label: item.title,
                            value: item.title
                        ;
                    ));
                ,
                error: function (XHR, textStatus, errorThrown, data) 

                    alert("Data"+data);
                    alert("XHR error: " + XHR);
                    alert("error: " + textStatus);
                    alert("error: " + errorThrown);
                
            );
        ,
        minLength: 3,
        select: function( event, ui ) 
            log( ui.item ?
              "Selected: " + ui.item.label :
              "Nothing selected, input was " + this.value);
        ,
        open: function() 
            $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" );
        ,
        close: function() 
            $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" );
        

JSON 文件的输出

"jQuery1111023084966000169516_1457628798511([\"title\":\"Course title example\"])"

但这并没有加载,它只是 JQuery 中的错误,数据未知。

我也试过了:

javascriptSerializer js = new JavaScriptSerializer();
        CourseJSON [] courses = js.Deserialize<CourseJSON[]>(jsonbuilder);
return Json(courses, JsonRequestBehavior.AllowGet);

但是由于它无法识别回调前缀而导致错误。

任何帮助将不胜感激,因为我不确定我哪里出错了!

谢谢,

安迪

【问题讨论】:

【参考方案1】:

您必须设置正确的内容类型。在 $.ajax 调用中应该是 application/Javascript

Best content type to serve JSONP?

更新: 您必须使用 URL 或 $.ajax 添加回调术语,如下所示。

http://leedsbeckett/search/getpredictivecoursetitlesearchresults&callback=?

url: "http://leedsbeckett/search/getpredictivecoursetitlesearchresults/",
            dataType: "jsonp",
            type: "POST", **jsonp:"callback"**,

【讨论】:

感谢您的回答。我已经尝试过了,但我仍然收到 err:r "parsererror" 的错误另外,“未调用 Jquery 9083450845098345_509348598340598”这可能是 C# 的东西而不是 JQuery 端?任何帮助表示赞赏!安迪 我已经更新了上面的答案。 您好,感谢您修改答案。在尝试了上述两个建议后,我仍然遇到解析错误。【参考方案2】:

我发现了为什么 JSONP 没有从 C# 正确返回的问题

我有jsonresult返回json的地方,它需要是actionresult,返回contenttype,在这里经过大量搜索后发现:Can I convert a JSON string into JsonResult?

添加内容类型然后将字符串转换为真正的 JSON,JS 可以读取:

public ActionResult GetPredictiveCourseTitleSearchResults()
    
        var jsonbuilder = "";
        var q = HttpContext.Request.Params["q"];
        var year = HttpContext.Request.Params["year"];
        var callback = HttpContext.Request.Params["callback"];
        var model = new courseModel
        
            SearchList = GetCourses(q,year)
        ;
        var results = model.SearchList.Items.ToList();
        int count = results.Count();
        int resultCount = 0;

        if (callback != "")
        
            jsonbuilder += callback + "(";
        
        jsonbuilder += "[";
        foreach(var result in results)
        

            if(resultCount+1 == count)
            
                jsonbuilder += "\"title\":\"" + result.Fields["title"].ToString() + "\"";
            
            else
            
                jsonbuilder += "\"title\":\"" + result.Fields["title"].ToString() + "\",";
            

            resultCount++;
        
        jsonbuilder += "]";
        if (callback != "")
        
            jsonbuilder += ")";
        
        return new ContentResult  Content = jsonbuilder, ContentType = "application/json" ;
        //return Json(jsonbuilder, JsonRequestBehavior.AllowGet);
    

感谢您帮助诊断问题 Thanigainathan。

【讨论】:

以上是关于C#将控制器数据返回到JSONP输出以进行自动完成[重复]的主要内容,如果未能解决你的问题,请参考以下文章

合并 3 个集合以每行返回一个对象

调用 WCF 服务时 JSONP 自动完成失败

使用 JSONP 的 Jquery 移动自动完成

如何使用 C# 或 cmd 将程序添加到控制面板程序中

从 JSP 返回 JSONP 而不是 JSON

返回 XML 时使用 JSONP