C# 在Jquery UI自动完成中解析JSON对象
我觉得这有一个简单的答案,但在将JSON数据返回到jQueryUIAutoComplete函数时,我遇到了一个问题。我正在使用“标签”和“值”字段,以便存储id字段。问题是,一旦将对象中的值传递回JQuery函数,我就无法解析它们 在ASP.NET C中,我有一个对象: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; } } 并将它
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);
}