Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Jquery UI自动完成中解析JSON对象_C#_Asp.net_Jquery Ui - Fatal编程技术网

C# 在Jquery UI自动完成中解析JSON对象

C# 在Jquery UI自动完成中解析JSON对象,c#,asp.net,jquery-ui,C#,Asp.net,Jquery Ui,我觉得这有一个简单的答案,但在将JSON数据返回到jQueryUIAutoComplete函数时,我遇到了一个问题。我正在使用“标签”和“值”字段,以便存储id字段。问题是,一旦将对象中的值传递回JQuery函数,我就无法解析它们 在ASP.NET C中,我有一个对象: public class AutoCompleteItem { public string label { get; set; } public string value { get; set; } } 并将它

我觉得这有一个简单的答案,但在将JSON数据返回到jQueryUIAutoComplete函数时,我遇到了一个问题。我正在使用“标签”和“值”字段,以便存储id字段。问题是,一旦将对象中的值传递回JQuery函数,我就无法解析它们

在ASP.NET C中,我有一个对象:

public class AutoCompleteItem
{
    public string label { get; set; }
    public string value { get; set; }
}
并将它们设置为列表,格式化为JSON,然后返回:

List<AutoCompleteItem> autoCompleteItems = new List<AutoCompleteItem>();
// Loop through data, add objects to list
var oSerializer = new JavaScriptSerializer();
string sJSON = oSerializer.Serialize(autoCompleteItems);
return sJSON;
这是我用来尝试从JSON获取数据的函数:

success: function (data) {
      response($.map(data.d, function (item) {
          return {
              label: item.label,
              value: item.value
          }
                                }));
},
我注意到,在使用“label”、“value”格式之前,我让它只处理一个IList字符串。传递的数据外部没有引号,而我的原始示例有引号

["Steve", "Joe", "Rick"]
我不知道这是否与问题有关,但我已经尝试了很多方法,但都没有效果。感谢您的帮助

您显示的JSON中没有.d属性。因此:

success: function (data) {
    response(
        $.map(data, function (item) {
            return {
                label: item.label,
                value: item.value
            };
        })
    );
},
但是如果您使用ASP.NET页面方法,那么您就拥有.d属性,并且不需要手动序列化JSON。例如,您可以在代码隐藏中使用以下PageMethod:

[WebMethod]
public static List<AutoCompleteItem> GetAutoCompleteValues(string term)
{
    // the term variable will contain what the user entered so far

    var autoCompleteItems = new List<AutoCompleteItem>();
    // Loop through data, add objects to list
    return autoCompleteItems;
}

您不需要转换JSON响应——jQueryUI已经需要这些令牌了

从jQuery UI文档:

$(function() {
        function log( message ) {
            $( "<div/>" ).text( message ).prependTo( "#log" );
            $( "#log" ).scrollTop( 0 );
        }

        $( "#birds" ).autocomplete({
            source: "search.php",
            minLength: 2,
            select: function( event, ui ) {
                log( ui.item ?
                    "Selected: " + ui.item.value + " aka " + ui.item.id :
                    "Nothing selected, input was " + this.value );
            }
        });
    });
当jQuery将第二个参数传递给文档示例select:中的事件处理程序时,您可以直接访问项的值和id属性。不需要任何转换。

为什么要首先使用JavaScriptSerializer? 你只需要

 public ActionResult GetUserAutoComplete(string term)
 {  
      var users = _userRepository.GetUsersByTerm(term);
      var autoCompleteData = users.Select(x => new { label = x.Name + " " + x.Surname, value = x.Name + " " + x.Surname, id = x.UserId, }).ToArray();
      return Json(data, JsonRequestBehavior.AllowGet);
}

见数据。d是正确的。您需要在jquery响应中转换数据?为什么要尝试将data.d映射到包含具有完全相同结构的对象的数组?直接使用data.d不应该是相同的吗?还是要保留原始响应的完整性?。此外,您使用的是data.d,但我在您之前显示的JSON数据上没有看到任何d属性。也许如果您直接使用数据?我相信“d”是.NET所独有的,它包含了我所讨论的对象。@琼斯-是的,我正试图让标签显示在自动建议框中,并在选择时存储每个条目的值。如果您使用转换器,那么使用json2.js您可以执行alertJSON.stringifydata;作为您成功的第一行:要准确查看您返回的内容。ASP.NET将在d属性中序列化JSON响应。他所说的是正确的。@villecoder,是的,但他没有使用ASP.NET进行序列化。他是手工做的。查看他正在使用的JavaScriptSerializer类?查看他在问题中显示的JSON。没有任何的痕迹。现在看看我在回答中显示的页面方法。这将使用.d属性。他确实是通过JavaScriptSerializer来实现的。但所做的只是将d属性从JSON对象更改为字符串。ASP.NET仍然使用一个JSON对象来响应AJAX请求,该对象使用数据的d属性。他没有使用ASP.NET MVC,或者至少他没有提到它。
$(function() {
        function log( message ) {
            $( "<div/>" ).text( message ).prependTo( "#log" );
            $( "#log" ).scrollTop( 0 );
        }

        $( "#birds" ).autocomplete({
            source: "search.php",
            minLength: 2,
            select: function( event, ui ) {
                log( ui.item ?
                    "Selected: " + ui.item.value + " aka " + ui.item.id :
                    "Nothing selected, input was " + this.value );
            }
        });
    });
 public ActionResult GetUserAutoComplete(string term)
 {  
      var users = _userRepository.GetUsersByTerm(term);
      var autoCompleteData = users.Select(x => new { label = x.Name + " " + x.Surname, value = x.Name + " " + x.Surname, id = x.UserId, }).ToArray();
      return Json(data, JsonRequestBehavior.AllowGet);
}