代码之家  ›  专栏  ›  技术社区  ›  hud

来自服务器端的JSON字符串不能正确使用ajaxjquery

  •  0
  • hud  · 技术社区  · 6 年前

    我要做的是,我从服务器端使用 mvc . 数据是正确的返回部分。 但是当我在客户端调试时,我得到的参数值是 [ .

    下面是我得到的JSON响应。

    [{"VENDORNAME":"ABC","VENDORCODE":"1234"},{"VENDORNAME":"Abc test","VENDORCODE":"233311"},{"VENDORNAME":"ABC 2","VENDORCODE":"12345"}]
    

    但当我向客户报到时 [ 在参数中。

    getValue: function (element) {        
            return {
                label: element.VENDORNAME,
                value: element.VENDORCODE
             };
        },  
    

    在里面 element 我只得到 [

    更新

    这是完整的代码

    var autocompleteOptions = {        
    
        url: function (phrase) {
            return AppConfig.PrefixURL + 'App/GetVendorData';
        },
    
        getValue: function () {        
            return {
                label: element.VENDORNAME,
                value: element.VENDORCODE
             };
        },      
    
        ajaxSettings: {
            dataType: "json",
            method: "POST",
            data: {
                dataType: "json",                
            }
        },        
    
        preparePostData: function (data) {
            data.phrase = $("#txtAssignVendor").val();           
            return data;
        },
    
        requestDelay: 400
    };
    

    以及下面的参考链接

    http://easyautocomplete.com/examples#examples-ddg

    服务器代码

    [HttpPost]
        public JsonResult GetVendorData(string phrase)
        {
            string strJsonData = "";
            try
            {
                Assignment ObjSAPAssign = new Assignment();
                DataTable dt = ObjSAPAssign.GetVendorList(phrase);               
                strJsonData = JsonConvert.SerializeObject(dt, Formatting.None);                
            }
            catch (Exception ex)
            {
                ApplicationLog.Error("Error", "GetVendorData", ex.Message);
                ErrorLog.HandleErrorLog("", "", "GetVendorData", ex.Message);
            }
            return Json(strJsonData);
        }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Kunal Mukherjee    6 年前

    错误是你把你的 DataTable 两次,一次 JsonConvert.SerializeObject() 另一个是 Json() 方法。


    public class VendorData 
    { 
        public string VENDORNAME { get; set; } 
        public string VENDORCODE { get; set; } 
    }
    

    这是修改后的动作方法

    [HttpPost] 
    public JsonResult GetVendorData(string phrase) 
    { 
        try 
        { 
            Assignment ObjSAPAssign = new Assignment(); 
            DataTable dt = ObjSAPAssign.GetVendorList(phrase); 
            List<VendorData> vendorList = dt.AsEnumerable().Select(row => new VendorData 
            { 
                VENDORNAME = row.Field<string>("VENDORNAME"), 
                VENDORCODE = row.Field<string>("VENDORCODE") 
            }).ToList();
    
            // Serializing only once 
            return Json(vendorList, JsonRequestBehavior.AllowGet); 
        } 
        catch (Exception ex) 
        { 
            ApplicationLog.Error("Error", "GetVendorData", ex.Message); 
            ErrorLog.HandleErrorLog("", "", "GetVendorData", ex.Message); 
            return Json(new object(), JsonRequestBehavior.AllowGet); 
        } 
    }
    

    最后在客户端:

    var autocompleteOptions = { 
    
    url: function (phrase) { 
        return AppConfig.PrefixURL + 'App/GetVendorData'; 
    }, 
    
    getValue: "VENDORNAME", 
    
    template: { 
        type: "description", 
        fields: { 
        description: "VENDORCODE" 
        } 
    }, 
    
    list: { 
        match: { 
            enabled: true 
        } 
    }, 
    
    ajaxSettings: { 
        dataType: "json", 
        method: "POST", 
        data: { 
            dataType: "json", 
        } 
    }, 
    
    preparePostData: function (data) { 
        data.phrase = $("#txtAssignVendor").val(); 
        return data; 
    }, 
    
    requestDelay: 400 
    };
    
        2
  •  2
  •   Pointy    6 年前

    您的服务器代码:

        string strJsonData = "";
        try
        {
            Assignment ObjSAPAssign = new Assignment();
            DataTable dt = ObjSAPAssign.GetVendorList(phrase);               
            strJsonData = JsonConvert.SerializeObject(dt, Formatting.None);                
        }
        catch (Exception ex)
        {
            ApplicationLog.Error("Error", "GetVendorData", ex.Message);
            ErrorLog.HandleErrorLog("", "", "GetVendorData", ex.Message);
        }
        return Json(strJsonData);
    

    您可以在中构建供应商列表 dt ,然后使用 JsonConvert.SerializeObject() 来构建响应JSON。但是,然后将其序列化 再一次 在最后一个电话里 Json() . 应该很简单

        return strJsonData;
    

    这就是为什么你 [ 作为第一个“元素”:autocomplete插件作为一个 一串 return 语句,它将正确接收您的实际表。

    编辑 我很确定上面的描述了这个问题,但我的建议行不通,因为那样的话 strJsonData JsonResult ). 基于 this other question 我认为这可能有用:不要使用 JsonConvert.SerializeObject . 相反,请使用纯文本 Json() :

        DataTable dt;
        try
        {
            Assignment ObjSAPAssign = new Assignment();
            dt = ObjSAPAssign.GetVendorList(phrase);               
    
        }
        catch (Exception ex)
        {
            ApplicationLog.Error("Error", "GetVendorData", ex.Message);
            ErrorLog.HandleErrorLog("", "", "GetVendorData", ex.Message);
        }
        return Json(dt, JsonRequestBehavior.AllowGet);                
    

    (请注意,我并不真正了解C#-关键是你必须使用 Json() 得到 JsonResult公司 DataTable .)

    现在,一旦问题解决了,并且autocomplete插件正确地接收到数组,接下来要决定的是如何处理它 getValue() 功能。插件期望处理 . 你只需要在函数中返回一个对象。

          getValue: function(element) {
            return element.VENDORNAME + " - " + element.VENDORCODE;
          }